Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/assets/js/asyncRouter.js
pull/1/head
chenxinying 2024-01-26 08:59:59 +08:00
commit bd76ab2a39
45 changed files with 5365 additions and 189 deletions

View File

@ -11,6 +11,7 @@
--el-fill-color-blank: #081435 !important; //
--el-border-color-lighter: var(--el-border-color) !important;
--el-bullet-frame-bg-color: #08163b !important;
--el-text-color-primary: #fff !important;
}
.el-button:focus, .el-button:hover {

View File

@ -112,6 +112,74 @@ export default [
},
],
},
{
path: "/troubleshooting_statistics",
redirect: "/troubleshooting_statistics/day_inspection",
meta: { title: "排查统计", model: MODEL["1"] },
component: "children",
children: [
{
path: "/troubleshooting_statistics/day_inspection",
meta: { title: "清单检查记录(日检)", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "troubleshooting_statistics/day_inspection/index",
},
{
path: "/troubleshooting_statistics/day_inspection/inspection_records",
meta: {
title: "检查记录",
activeMenu: "/troubleshooting_statistics/day_inspection",
},
component:
"troubleshooting_statistics/day_inspection/inspection_records",
},
],
},
{
path: "/troubleshooting_statistics/week_inspection",
meta: { title: "清单检查记录(周检)", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "troubleshooting_statistics/week_inspection/index",
},
{
path: "/troubleshooting_statistics/week_inspection/inspection_records",
meta: {
title: "检查记录",
activeMenu: "/troubleshooting_statistics/week_inspection",
},
component:
"troubleshooting_statistics/week_inspection/inspection_records",
},
],
},
{
path: "/troubleshooting_statistics/ten_day_inspection",
meta: { title: "清单检查记录(旬检)", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "troubleshooting_statistics/ten_day_inspection/index",
},
{
path: "/troubleshooting_statistics/ten_day_inspection/inspection_records",
meta: {
title: "检查记录",
activeMenu: "/troubleshooting_statistics/ten_day_inspection",
},
component:
"troubleshooting_statistics/ten_day_inspection/inspection_records",
},
],
},
],
},
{
path: "/system_operation",
redirect: "/system_operation/system_documents",
@ -664,17 +732,211 @@ export default [
meta: { title: "排班管理", model: MODEL["1"], isSubMenu: false },
component: "workforce_management/index",
},
{
path: "/keyprojects",
redirect: "/keyprojects/units",
meta: { title: "重点工程", model: MODEL["1"] },
component: "children",
children: [
{
path: "/keyprojects/units",
meta: { title: "相关方管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "keyprojects/units/index",
},
{
path: "/keyprojects/units/add",
meta: {
title: "新增",
activeMenu: "/keyprojects/units",
},
component: "keyprojects/units/add",
},
{
path: "/keyprojects/units/edit",
meta: {
title: "修改",
activeMenu: "/keyprojects/units",
},
component: "keyprojects/units/add",
},
],
},
{
path: "/keyprojects/personnelmanagement",
meta: { title: "相关方人员管理", isSubMenu: false },
component: "keyprojects/personnelmanagement/index",
},
{
path: "/keyprojects/outsourced",
meta: { title: "重点工程管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "keyprojects/outsourced/index",
},
{
path: "/keyprojects/outsourced/add",
meta: {
title: "新增",
activeMenu: "/keyprojects/outsourced",
},
component: "keyprojects/outsourced/add",
},
{
path: "/keyprojects/outsourced/add",
meta: {
title: "编辑",
activeMenu: "/keyprojects/outsourced",
},
component: "keyprojects/outsourced/add",
},
{
path: "/keyprojects/outsourced/view",
meta: {
title: "查看",
activeMenu: "/keyprojects/outsourced",
},
component: "keyprojects/outsourced/view",
},
],
},
{
path: "/keyprojects/inspection",
meta: { title: "安全、环保检查", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "keyprojects/inspection/index",
},
{
path: "/keyprojects/inspection/record_list",
meta: {
title: "查看列表",
activeMenu: "/keyprojects/inspection"
},
component: "children",
children: [
{
path: "",
component: "keyprojects/inspection/record_list"
},
{
path: "/keyprojects/inspection/record_view",
meta: {
title: "查看详情",
activeMenu: "/keyprojects/inspection",
},
component: "keyprojects/inspection/record_view",
},
]
},
]
},
{
path: "/keyprojects/hidden",
meta: { title: "隐患排查", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "keyprojects/hidden/index",
},
{
path: "/keyprojects/hidden/record_list",
meta: {
title: "查看列表",
activeMenu: "/keyprojects/hidden"
},
component: "children",
children: [
{
path: "",
component: "keyprojects/hidden/record_list"
},
{
path: "/keyprojects/hidden/record_view",
meta: {
title: "查看详情",
activeMenu: "/keyprojects/hidden",
},
component: "keyprojects/hidden/record_view",
},
]
},
]
},
{
path: "/keyprojects/punish",
meta: { title: "处罚管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "keyprojects/punish/index",
},
{
path: "/keyprojects/punish/record_list",
meta: {
title: "查看列表",
activeMenu: "/keyprojects/punish"
},
component: "children",
children: [
{
path: "",
component: "keyprojects/punish/record_list"
},
{
path: "/keyprojects/punish/record_view",
meta: {
title: "查看详情",
activeMenu: "/keyprojects/punish",
},
component: "keyprojects/punish/record_view",
},
]
},
]
},
{
path: "/keyprojects/aiwarning",
meta: { title: "AI报警", isSubMenu: false },
component: "keyprojects/aiwarning/index",
},
{
path: "/keyprojects/videomanager",
meta: { title: "视频监控", isSubMenu: false },
component: "keyprojects/videomanager/index",
},
],
},
{
path: "/off_duty_management",
redirect: "/off_duty_management/leave",
meta: { title: "离岗管理", model: MODEL["1"] },
component: "children",
children: [
{
path: "/off_duty_management/setting",
meta: { title: "离岗设置", isSubMenu: false },
component: "off_duty_management/setting/index",
},
{
path: "/off_duty_management/leave",
meta: { title: "离岗管理", isSubMenu: false },
component: "off_duty_management/leave/index",
},
{
path: "/off_duty_management/record",
meta: { title: "离岗记录", isSubMenu: false },
component: "off_duty_management/record/index",
},
{
path: "/off_duty_management/login_record",
meta: { title: "登录记录", isSubMenu: false },
@ -1220,14 +1482,6 @@ export default [
},
component: "confined_space/job_data/view",
},
{
path: "/confined_space/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/confined_space/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1273,14 +1527,6 @@ export default [
},
component: "blind_plate_plugging/job_data/view",
},
{
path: "/blind_plate_plugging/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/blind_plate_plugging/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1321,14 +1567,6 @@ export default [
},
component: "groundbreaking/job_data/view",
},
{
path: "/groundbreaking/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/groundbreaking/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1369,14 +1607,6 @@ export default [
},
component: "high/job_data/view",
},
{
path: "/high/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/high/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1417,14 +1647,6 @@ export default [
},
component: "hoisting/job_data/view",
},
{
path: "/hoisting/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/hoisting/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1465,14 +1687,6 @@ export default [
},
component: "open_circuit/job_data/view",
},
{
path: "/open_circuit/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/open_circuit/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1513,14 +1727,6 @@ export default [
},
component: "temporary_electricity_usage/job_data/view",
},
{
path: "/temporary_electricity_usage/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/temporary_electricity_usage/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1561,14 +1767,6 @@ export default [
},
component: "hot_work/job_data/view",
},
{
path: "/hot_work/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/hot_work/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1682,6 +1880,84 @@ export default [
},
],
},
{
path: "/security_commitment_pro",
redirect: "/security_commitment_pro/template",
meta: { title: "安全承诺Pro", model: MODEL["4"] },
component: "children",
children: [
{
path: "/security_commitment_pro/template",
meta: { title: "安全承诺书模板", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "security_commitment_pro/template/index",
},
{
path: "/security_commitment_pro/template/add",
meta: {
title: "新增",
activeMenu: "/security_commitment_pro/template",
},
component: "security_commitment_pro/template/add",
},
{
path: "/security_commitment_pro/template/edit",
meta: {
title: "编辑",
activeMenu: "/security_commitment_pro/template",
},
component: "security_commitment_pro/template/add",
},
],
},
{
path: "/security_commitment_pro/administration",
meta: { title: "安全承诺书管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "security_commitment_pro/administration/index",
},
{
path: "/security_commitment_pro/administration/add",
meta: {
title: "新增",
activeMenu: "/security_commitment_pro/administration",
},
component: "security_commitment_pro/administration/add",
},
{
path: "/security_commitment_pro/administration/edit",
meta: {
title: "编辑",
activeMenu: "/security_commitment_pro/administration",
},
component: "security_commitment_pro/administration/add",
},
{
path: "/security_commitment_pro/administration/view",
meta: {
title: "查看",
activeMenu: "/security_commitment_pro/administration",
},
component: "security_commitment_pro/administration/view",
},
{
path: "/security_commitment_pro/administration/details",
meta: {
title: "详情",
activeMenu: "/security_commitment_pro/administration",
},
component: "security_commitment_pro/administration/details",
},
],
},
],
},
{
path: "/video_manager",
redirect: "/video_manager/video_manager",

View File

@ -97,13 +97,6 @@ export const layoutFnGetRiskCauses = async () => {
});
return ref(resData.list);
};
// 部门级别
export const layoutFnGetDepartmentLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "4a661fa8aedc4d158c9cddaa9d2ec47e",
});
return ref(resData.list);
};
// 民族
export const layoutFnGetNation = async () => {
const resData = await getLevels({
@ -237,6 +230,13 @@ export const layoutFnGetRiskClassification = async () => {
});
return ref(resData.list);
};
// 承诺书级别
export const layoutFnGetCommitmentLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "8c5064693fba4dbca1cbfea631cd097a",
});
return ref(resData.list);
};
// 部门树
export const layoutFnGetDepartmentTree = async (params) => {
const resData = await getDepartmentTree(params);
@ -252,3 +252,11 @@ export const layoutFnGetLevelsAndChildrenNumber = async (DICTIONARIES_ID) => {
const resData = await getLevelsAndChildrenNumber({ DICTIONARIES_ID });
return ref(resData.list);
};
// 相关方作业类别
export const layoutFnGetPersonnelmanagementJobType = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "a8bfd4554af54ee2b816f3007d8baea6",
});
return ref(resData.list);
};

View File

@ -288,12 +288,17 @@ export function addingPrefixToFile(list) {
* @param {string} key 验证的字段
* @param {string} id 验证的值
**/
export function verifyDuplicateSelection(list, index, key, id) {
if (list.some((item) => item[key] === id)) {
ElMessage.warning("不能重复选择");
} else {
list[index][key] = id;
}
export async function verifyDuplicateSelection(list, index, key, id) {
return new Promise((resolve, reject) => {
if (list.some((item) => item[key] === id)) {
ElMessage.warning("不能重复选择");
// eslint-disable-next-line prefer-promise-reject-errors
reject();
} else {
list[index][key] = id;
resolve();
}
});
}
/**

View File

@ -0,0 +1,52 @@
import { post, upload } from "@/request/axios.js";
export const getUnitsListAll = () => post("/units/listAll"); // 施工相关方全部
export const getUnitsList = (params) => post("/units/list", params); // 相关方列表
export const setUnitsAdd = (params) => upload("/units/add", params); // 相关方添加
export const setUnitsGoEdit = (params) => post("/units/goEdit", params); // 相关方修改获取
export const setUnitsEdit = (params) => upload("/units/edit", params); // 相关方修改
export const setUnitsDelete = (params) => post("/units/delete", params); // 相关方删除
export const setUnitsDeleteAll = (params) => post("/units/deleteAll", params); // 相关方删除(多选)
export const setIsTrueDelete = (params) =>
post("/personnelmanagement/isTrueDelete", params); // 查看是否可删除
export const setIsTrueDeleteAll = (params) =>
post("/personnelmanagement/isTrueDeleteAll", params); // 查看是否可删除(全部)
export const getPersonnelmanagementList = (params) =>
post("/personnelmanagement/list", params); // 相关方人员列表
export const setPersonnelmanagementResetPwd = (params) =>
post("/personnelmanagement/resetPwd", params); // 相关方人员重置密码
export const setPersonnelmanagementAdd = (params) =>
post("/personnelmanagement/add", params); // 相关方人员添加
export const setPersonnelmanagementEdit = (params) =>
post("/personnelmanagement/edit", params); // 相关方人员编辑
export const setPersonnelmanagementGoEdit = (params) =>
post("/personnelmanagement/goEdit", params); // 相关方人员编辑获取
export const setPersonnelmanagementDelete = (params) =>
post("/personnelmanagement/delete", params); // 相关方人员删除
export const setPersonnelmanagementDeleteAll = (params) =>
post("/personnelmanagement/deleteAll", params); // 相关方人员批量删除
export const setPersonnelmanagementListAll = (params) =>
post("/personnelmanagement/listAll", params); // 相关方人员列表
export const getOutsourcedList = (params) => post("/outsourced/list", params); // 重点工程列表
export const setOutsourcedAdd = (params) => upload("/outsourced/add", params); // 重点工程添加
export const setOutsourcedEdit = (params) => upload("/outsourced/edit", params); // 重点工程修改
export const setOutsourcedGoEdit = (params) =>
post("/outsourced/goEdit", params); // 重点工程修改获取
export const setOutsourcedDelete = (params) =>
post("/outsourced/delete", params); // 重点工程修改获取
export const getKeyprojectcheckList = (params) =>
post("/keyprojectcheck/list", params); // 安全环保检查列表
export const getKeyprojectcheckGoEdit = (params) =>
post("/keyprojectcheck/goEdit", params); // 安全环保检查详情
export const getKeyprojectcheckListHidden = (params) =>
post("/keyprojectcheck/listHidden", params); // 安全环保检查隐患列表
export const getKeyprojectcheckFindHidden = (params) =>
post("/keyprojectcheck/findHidden", params); // 安全环保检查隐患详情
export const getKeyprojectpunishList = (params) =>
post("/keyprojectpunish/list", params); // 处罚列表
export const getKeyprojectpunishGoEdit = (params) =>
post("/keyprojectpunish/goEdit", params); // 处罚列表详情

View File

@ -7,4 +7,8 @@ export const getApprovedByList = (params) =>
post("/app/sys/listUserLeader", params); // 离岗管理获取审批人
export const setLeaveReview = (params) => post("/offduty/review", params); // 离岗管理审批
export const setLeaveCancel = (params) => post("/offduty/cancel", params); // 离岗管理取消
export const getSettingList = (params) => post("/offdutySetup/list", params); // 离岗设置列表
export const setSettingChange = (params) =>
post("/offdutySetup/editSetup", params); // 离岗设置切换
export const getRecordList = (params) => post("/offduty/list", params); // 离岗记录列表
export const getLoginRecordList = (params) => post("/fhlog/getList", params); // 登录记录列表

View File

@ -0,0 +1,27 @@
import { post } from "@/request/axios.js";
export const getTemplateList = (params) => post("/promise/list", params); // 安全承诺书模板列表
export const getTemplateView = (params) => post("/promise/goEdit", params); // 安全承诺书模板查看
export const setTemplateEnableOrDisable = (params) =>
post("/promise/editdelete", params); // 安全承诺书模板启用禁用
export const setTemplateDelete = (params) => post("/promise/delete", params); // 安全承诺书模板删除
export const setTemplateEdit = (params) => post("/promise/edit", params); // 安全承诺书模板修改
export const setTemplateAdd = (params) => post("/promise/add", params); // 安全承诺书模板新增
export const getAdministrationList = (params) =>
post("/corppromise/list", params); // 安全承诺书模板列表
export const getAdministrationView = (params) =>
post("/corppromise/goEdit", params); // 安全承诺书模板查看
export const setAdministrationEnableOrDisable = (params) =>
post("/corppromise/editdelete", params); // 安全承诺书管理启用禁用
export const setAdministrationEdit = (params) =>
post("/corppromise/edit_II", params); // 安全承诺书管理修改
export const setAdministrationAdd = (params) =>
post("/corppromise/add_II", params); // 安全承诺书管理新增
export const getAdministrationDetailsList = (params) =>
post("/corppromise/peopledetails", params); // 安全承诺书模板详情列表
export const getAdministrationDetailsView = (params) =>
post("/corppromise/peopleview", params); // 安全承诺书模板详情查看
export const getAdministrationSelectTemplateList = (params) =>
post("/corppromise/showtemplatetext", params); // 安全承诺书选择模板列表
export const getAdministrationSelectTemplateCheck = (params) =>
post("/corppromise/collateral", params); // 安全承诺书选择模板选择

View File

@ -0,0 +1,10 @@
import { post } from "@/request/axios.js";
export const getChecklistInspectionRecordList = (params) =>
post("/listmanager/recordList", params); // 清单检查记录列表
export const getChecklistInspectionRecordDayInspectionList = (params) =>
post("/listmanager/statisticsListCheckDay", params); // 清单检查记录日检列表
export const getChecklistInspectionRecordWeekInspectionList = (params) =>
post("/listmanager/statisticsListCheckWeek", params); // 清单检查记录周检列表
export const getChecklistInspectionRecordTenDayInspectionList = (params) =>
post("/listmanager/statisticsListCheckTenday", params); // 清单检查记录旬检列表

View File

@ -14,7 +14,7 @@
<el-form-item label="部门级别" prop="LEVEL">
<el-select v-model="form.LEVEL">
<el-option
v-for="item in departmentLevel"
v-for="item in inventoryLevel"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
@ -84,7 +84,7 @@ import { useVModels } from "@vueuse/core";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { layoutFnGetDepartmentLevel } from "@/assets/js/data_dictionary.js";
import { layoutFnGetInventoryLevel } from "@/assets/js/data_dictionary.js";
import LayoutDepartment from "@/components/department/index.vue";
import { useUserStore } from "@/pinia/user.js";
import {
@ -137,7 +137,7 @@ const rules = {
};
const userStore = useUserStore();
const formRef = ref(null);
const departmentLevel = await layoutFnGetDepartmentLevel();
const inventoryLevel = await layoutFnGetInventoryLevel();
const fnChangeRegulatoryAuthorities = (event) => {
if (event === "1" && form.value.checkedIds.length === 0) {
if (props.type === "add")

View File

@ -0,0 +1,106 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CREATOR_CORP_NAME" label="添加单位" />
<el-table-column prop="CREATOR_NAME" label="添加人" width="200" />
<el-table-column prop="UNITS_NAME" label="单位名称" width="150" />
<el-table-column prop="JOBTYPE" label="作业类别" width="100" />
<el-table-column prop="OPERATIONITEM" label="操作项目" />
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="SEX" label="性别" />
<el-table-column prop="CERTIFICATE_NUM" label="作业证书编号" />
<el-table-column prop="REVIEWTIME" label="复审时间" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnView(row.PERSONNELMANAGEMENT_ID)"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import {
getPersonnelmanagementList,
setPersonnelmanagementGoEdit,
} from "@/request/keyprojects.js";
import { reactive } from "vue";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getPersonnelmanagementList);
const data = reactive({
type: "",
title: "",
editDialog: {
visible: false,
form: {},
},
});
const fnGoEdit = async (id) => {
const resData = await setPersonnelmanagementGoEdit({
PERSONNELMANAGEMENT_ID: id,
});
data.editDialog.form = resData.pd;
};
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
const fnView = async (id) => {
data.editDialog.form = {};
data.editDialog.visible = true;
data.editDialog.type = "view";
data.editDialog.title = "查看";
fnGoEdit(id);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,91 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="OUTSOURCED_NAME" label="重点工程名称" />
<el-table-column prop="DEPARTMENT_NAME" label="监管部门" width="250" />
<el-table-column
prop="MANAGE_CORPS_NAME"
label="监理单位"
width="250"
/>
<el-table-column
prop="UNITS_PIC_NAME"
label="相关方单位负责人"
width="200"
/>
<el-table-column prop="UNITS_PHONE" label="电话" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/hidden/record_list',
query: {
OUTSOURCED_ID: row.OUTSOURCED_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getOutsourcedList } from "@/request/keyprojects.js";
import router from "@/router";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getOutsourcedList);
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,128 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="验收状态" prop="KEYWORDS">
<el-select v-model="searchForm.ISCHECK">
<el-option label="待验收隐患" value="1" />
<el-option label="已验收隐患" value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column label="重点工程名称">
<template v-slot="{ row }">
{{
row.OUTSOURCED_NAME ? row.OUTSOURCED_NAME : row.AIOUTSOURCED_NAME
}}
</template>
</el-table-column>
<el-table-column label="隐患来源" width="200">
<template v-slot="{ row }">
<span v-if="row.SOURCE === 1">AI</span>
<span v-if="row.SOURCE === 2">AI</span>
<span v-if="row.SOURCE === 3">()</span>
<span v-if="row.SOURCE === 4">()</span>
</template>
</el-table-column>
<el-table-column label="隐患发现人" width="150">
<template v-slot="{ row }">
{{ row.CREATOR_NAME || row.CREATOR_NAMES }}
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="隐患发现时间" width="100" />
<el-table-column prop="RECTIFICATIONOR_NAME" label="隐患整改人" />
<el-table-column prop="RECTIFICATIONTIME" label="整改时间" />
<el-table-column prop="CREATOR_NAME" label="隐患验收人" width="100" />
<el-table-column prop="CHECKTIME" label="验收时间" width="100" />
<el-table-column label="隐患状态" width="100">
<template v-slot="{ row }">
<span v-if="row.SOURCE === 1"></span>
<span v-if="row.SOURCE === 2"></span>
<span v-if="row.SOURCE === 4"></span>
</template>
</el-table-column>
<el-table-column label="是否处罚" width="100">
<template v-slot="{ row }">
{{ row.ISPUNISH && (row.ISPUNISH === "1" ? "是" : "否") }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/hidden/record_view',
query: {
HIDDEN_ID: row.HIDDEN_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getKeyprojectcheckListHidden } from "@/request/keyprojects.js";
import router from "@/router";
import { useRoute } from "vue-router";
const route = useRoute();
const { OUTSOURCED_ID } = route.query;
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getKeyprojectcheckListHidden, {
otherParams: { OUTSOURCED_ID },
});
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,71 @@
<template>
<div>
<layout-card>
<div id="printContent">
<el-divider content-position="left">检查信息</el-divider>
<el-descriptions border>
<el-descriptions-item label="隐患照片 ">
{{ data.info.INSPECTION_CATEGORY }}
</el-descriptions-item>
<el-descriptions-item label="隐患描述">
{{ data.info.HIDDENDESCR }}
</el-descriptions-item>
<el-descriptions-item label="隐患部位 ">
{{ data.info.HIDDENPART }}
</el-descriptions-item>
<el-descriptions-item label="隐患级别">
{{ data.info.HIDDENLEVEL_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患类型 ">
限期整改
</el-descriptions-item>
<el-descriptions-item label="整改期限">
{{ data.info.RECTIFICATIONDEADLINE }}
</el-descriptions-item>
<el-descriptions-item label="整改部门 ">
{{ data.info.RECTIFICATIONDEPT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="整改人">
{{ data.info.RECTIFICATIONOR_NAME }}
</el-descriptions-item>
<el-descriptions-item label="整改时间">
{{ data.info.RECTIFICATIONTIME }}
</el-descriptions-item>
<el-descriptions-item label="整改照片">
{{ data.info.RECTIFICATIONTIME }}
</el-descriptions-item>
<el-descriptions-item label="验收时间">
{{ data.info.CHECKTIME }}
</el-descriptions-item>
<el-descriptions-item label="验收图片">
{{ data.info.CHECKTIME }}
</el-descriptions-item>
<el-descriptions-item label="是否进行罚款">
{{ pd.ISPUNISH === "1" ? "是" : "否" }}
</el-descriptions-item>
</el-descriptions>
</div>
</layout-card>
</div>
</template>
<script setup>
import { getKeyprojectcheckFindHidden } from "@/request/keyprojects";
import { reactive } from "vue";
import { useRoute } from "vue-router";
const route = useRoute();
const data = reactive({
info: {},
});
const fnGetData = async () => {
const resData = await getKeyprojectcheckFindHidden({
HIDDEN_ID: route.query.HIDDEN_ID,
});
data.info = resData.pd;
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,92 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="OUTSOURCED_NAME" label="重点工程名称" />
<el-table-column prop="DEPARTMENT_NAME" label="监管部门" width="200" />
<el-table-column
prop="MANAGE_CORPS_NAME"
label="监理单位"
width="200"
/>
<el-table-column
prop="UNITS_PIC_NAME"
label="相关方单位负责人"
width="200"
/>
<el-table-column prop="UNITS_PHONE" label="电话" />
<el-table-column prop="CHECK_COUNT" label="安全环保检查次数" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/inspection/record_list',
query: {
OUTSOURCED_ID: row.OUTSOURCED_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getOutsourcedList } from "@/request/keyprojects.js";
import router from "@/router";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getOutsourcedList);
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,103 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="INSPECTION_PLACE" label="检查场所" />
<el-table-column
prop="INSPECTION_STATUS"
label="检查状态"
width="200"
/>
<el-table-column
prop="INSPECTION_TYPE_NAME"
label="检查类型"
width="150"
/>
<el-table-column prop="INSPECTION_USERS" label="检查人" width="100" />
<el-table-column prop="PERSON_NAME" label="被检查人" />
<el-table-column label="检查时间">
<template v-slot="{ row }">
{{ row.INSPECTION_TIME_START }}-{{ row.INSPECTION_TIME_END }}
</template>
</el-table-column>
<el-table-column prop="HIDDEN_COUNT" label="检查隐患数" width="100" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/inspection/record_view',
query: {
KEYPROJECTCHECK_ID: row.KEYPROJECTCHECK_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getKeyprojectcheckList } from "@/request/keyprojects.js";
import router from "@/router";
import { useRoute } from "vue-router";
const route = useRoute();
const { OUTSOURCED_ID } = route.query;
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getKeyprojectcheckList, {
otherParams: { OUTSOURCED_ID },
});
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,85 @@
<template>
<div>
<layout-card>
<div id="printContent">
<el-divider content-position="left">检查信息</el-divider>
<el-descriptions border :column="2">
<el-descriptions-item label="检查题目 ">
{{ data.info.INSPECTION_CATEGORY }}
</el-descriptions-item>
<el-descriptions-item label="记录填写时间">
{{ data.info.CREATTIME }}
</el-descriptions-item>
<el-descriptions-item label="被检查单位 ">
{{ data.info.UNITS_NAME }}
</el-descriptions-item>
<el-descriptions-item label="被检查单位现场负责人">
{{ data.info.PERSON_NAME }}
</el-descriptions-item>
<el-descriptions-item label="检查场所 ">
{{ data.info.INSPECTION_PLACE }}
</el-descriptions-item>
<el-descriptions-item label="检查类型">
{{ data.info.INSPECTION_TYPE_NAME }}
</el-descriptions-item>
<el-descriptions-item label="检查开始时间 ">
{{ data.info.INSPECTION_TIME_START }}
</el-descriptions-item>
<el-descriptions-item label="检查结束时间">
{{ data.info.INSPECTION_TIME_END }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">检查情况</el-divider>
<layout-table :data="data.info.situationList" :show-pagination="false">
<el-table-column label="序号" width="70" type="index" />
<el-table-column prop="SITUATION" label="检查情况" />
</layout-table>
<el-divider content-position="left">检查人员</el-divider>
<el-descriptions border :column="1">
<el-descriptions-item label="检查人员">
{{ data.info.INSPECTION_USERS }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">发现问题</el-divider>
<layout-table :data="data.info.hiddenList" :show-pagination="false">
<el-table-column label="序号" width="70" type="index" />
<el-table-column prop="HIDDENPART" label="隐患部位" />
<el-table-column prop="HIDDENDESCR" label="隐患描述" />
<el-table-column label="状态" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="row"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</div>
</layout-card>
</div>
</template>
<script setup>
import { getKeyprojectcheckGoEdit } from "@/request/keyprojects";
import { reactive } from "vue";
import { useRoute } from "vue-router";
const route = useRoute();
const data = reactive({
info: {},
});
const fnGetData = async () => {
const resData = await getKeyprojectcheckGoEdit({
KEYPROJECTCHECK_ID: route.query.KEYPROJECTCHECK_ID,
});
data.info = resData.pd;
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,366 @@
<template>
<layout-card>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="175px"
>
<el-divider content-position="left">工商信息</el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="企业监督部门" prop="DEPARTMENT_ID">
<layout-department
v-model="data.form.DEPARTMENT_ID"
multiple
show-checkbox
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业主管部门" prop="COMPETENT_DEPT_ID">
<layout-department v-model="data.form.COMPETENT_DEPT_ID" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业辖区部门" prop="INVOLVING_CORPS_DEPART_ID">
<layout-department
v-model="data.form.INVOLVING_CORPS_DEPART_ID"
multiple
show-checkbox
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="重点工程名称" prop="OUTSOURCED_NAME">
<el-input
v-model="data.form.OUTSOURCED_NAME"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划工期起止时间">
<el-date-picker
v-model="data.form.STARTTIME_TIMES"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同号">
<el-input
v-model="data.form.CONTRACT_NUM"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="施工相关方" prop="UNITS_ID">
<el-select
v-model="data.form.UNITS_ID"
clearable
placeholder="请选择相关方"
@change="fnGetUnitUser"
>
<el-option
v-for="item in data.unitsList"
:key="item.UNITS_ID"
:label="item.UNITS_NAME"
:value="item.UNITS_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="相关方单位工程负责人" prop="UNITS_PIC">
<el-select
v-model="data.form.UNITS_PIC"
clearable
placeholder="请选择人员"
@change="fnSelectUnitsUser($event)"
>
<el-option
v-for="item in data.unitsUserList"
:key="item.PERSONNELMANAGEMENT_ID"
:label="item.NAME"
:value="item.PERSONNELMANAGEMENT_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="相关方单位负责人手机" prop="UNITS_PHONE">
<el-input
disabled
v-model="data.form.UNITS_PHONE"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="监理单位名称">
<el-input
v-model="data.form.MANAGE_NAME"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="监理单位工程负责人">
<el-input v-model="data.form.MANAGE_PIC" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="监理单位负责人手机">
<el-input
v-model="data.form.MANAGE_PHONE"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="集团单位">
<el-input v-model="data.form.GROUP_UNIT" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="状态" prop="STATE">
<el-select v-model="data.form.STATE" placeholder="请选择状态">
<el-option label="进行中" value="1" />
<el-option label="已结束" value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否发送短信">
<el-input v-model="data.form.IS_SMS" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="安全管理协议(附件)" prop="CONTACTS">
<el-input v-model="data.form.CONTACTS" placeholder="请输入内容" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider content-position="left">
处罚相关&nbsp;&nbsp;
<el-button size="small" @click="addInspector"> </el-button>
</el-divider>
<template>
<template>
<template
v-for="(item, index) in data.form.acceptanceList"
:key="item.id"
>
<el-col :span="11">
<el-form-item
label="验收部门"
:prop="'acceptanceList.' + index + '.DEPARTMENT_ID'"
:rules="{
required: true,
message: '请选择验收部门',
trigger: 'change',
}"
>
<layout-department
v-model="item.DEPARTMENT_ID"
@update:model-value="fnInspectDepartmentChange($event, index)"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item
label="验收人"
:prop="'acceptanceList.' + index + '.USER_ID'"
:rules="{
required: true,
message: '请选择验收人',
trigger: 'change',
}"
>
<el-select
:model-value="item.USER_ID"
@change="
verifyDuplicateSelection(
data.form.acceptanceList,
index,
'USER_ID',
$event
)
"
>
<el-option
v-for="item in item.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label-width="10px">
<el-button
type="primary"
v-if="index === 0"
@click="fnAddInspectedList"
>
添加
</el-button>
<el-button
type="danger"
v-if="index !== 0"
@click="data.form.acceptanceList.splice(index, 1)"
>
删除
</el-button>
</el-form-item>
</el-col>
</template>
</template>
</template>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"> </el-button>
</div>
</layout-card>
</template>
<script setup>
import useFormValidate from "@/assets/js/useFormValidate";
import {
getUnitsListAll,
setOutsourcedAdd,
setOutsourcedEdit,
setOutsourcedGoEdit,
setPersonnelmanagementListAll,
} from "@/request/keyprojects";
import { ElMessage } from "element-plus";
import { debounce } from "throttle-debounce";
import { reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import LayoutDepartment from "@/components/department/index.vue";
import { getUserListAll } from "@/request/data_dictionary";
const router = useRouter();
const route = useRoute();
const formRef = ref(null);
const rules = {
DEPARTMENT_ID: [
{ required: true, message: "请选择相关部门", trigger: "blur" },
],
COMPETENT_DEPT_ID: [
{ required: true, message: "请选择相关部门", trigger: "blur" },
],
INVOLVING_CORPS_DEPART_ID: [
{ required: true, message: "请选择相关部门", trigger: "blur" },
],
OUTSOURCED_NAME: [
{ required: true, message: "请输入重点工程名称", trigger: "blur" },
],
UNITS_ID: [{ required: true, message: "请选择相关方", trigger: "blur" }],
UNITS_PIC: [
{ required: true, message: "请选择相关方负责人", trigger: "blur" },
],
UNITS_PHONE: [
{ required: true, message: "请输入负责人手机号", trigger: "blur" },
],
STATE: [{ required: true, message: "请选择状态", trigger: "blur" }],
};
const data = reactive({
form: {
acceptanceList: [
{
id: Math.random(),
DEPARTMENT_ID: "",
USER_ID: "",
userList: [],
},
],
},
inspectorList: [
{ INSPECTION_DEPARTMENT_ID: "", INSPECTION_USER_ID: "", USER_SIDE: "" },
],
INSPECTOR_List: [],
unitsList: [],
});
const addInspector = () => {
data.inspectorList.push({
INSPECTION_DEPARTMENT_ID: "",
INSPECTION_USER_ID: "",
USER_SIDE: "",
});
data.INSPECTOR_List.push([]);
};
const fnGetData = async () => {
const resData = await setOutsourcedGoEdit({
OUTSOURCED_ID: route.query.outsourcedId,
});
data.form = resData.pd;
data.form.acceptanceList = resData.punishThePerson;
};
if (route.query.type === "edit") fnGetData();
const fnGetUnitsList = async () => {
const resData = await getUnitsListAll({});
data.unitsList = resData.varList;
};
fnGetUnitsList();
const fnGetUnitUser = async () => {
const resData = await setPersonnelmanagementListAll({
UNITS_ID: data.form.UNITS_ID,
});
data.form.UNITS_PIC = "";
data.form.UNITS_PHONE = "";
data.unitsUserList = resData.varList;
};
const fnSelectUnitsUser = (event) => {
data.unitsUserList.forEach((item) => {
if (item.PERSONNELMANAGEMENT_ID === event) {
data.form.UNITS_PHONE = item.PHONENUM;
}
});
};
const fnInspectDepartmentChange = async (event, index) => {
data.form.acceptanceList[index].USER_ID = "";
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.form.acceptanceList[index].userList = resData.userList;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
if (data.form.STARTTIME_TIMES && data.form.STARTTIME_TIMES.length > 0) {
formData.append("STARTTIME", data.form.STARTTIME_TIMES[0]);
formData.append("ENDTIME", data.form.STARTTIME_TIMES[1]);
}
route.query.type === "edit"
? await setOutsourcedEdit(formData)
: await setOutsourcedAdd(formData);
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,201 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="创建单位" prop="CORP_NAME">
<el-input v-model="searchForm.CORP_NAME" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="施工相关方" prop="UNITS_ID">
<el-select
v-model="searchForm.UNITS_ID"
clearable
placeholder="请选择状态"
>
<el-option
v-for="item in data.unitsList"
:key="item.UNITS_ID"
:label="item.UNITS_NAME"
:value="item.UNITS_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
prop="CORP_NAME"
label="创建单位"
/>
<el-table-column prop="OUTSOURCED_NAME" label="重点工程名称" />
<el-table-column prop="UNITS_NAME" label="施工相关方" />
<el-table-column prop="UNITS_NAME" label="辖区单位">
<template v-slot="{ row }">
<span v-if="row.JURISDICTION_UNIT_NAME">
{{ row.JURISDICTION_UNIT_NAME }}
</span>
<span v-else>{{ row.INVOLVING_CORPS_DEPART_NAME }}</span>
</template>
</el-table-column>
<el-table-column prop="UNITS_NAME" label="主管部门">
<template v-slot="{ row }">
<span v-if="row.Q_COMPETENT_DEPT_NAME">
{{ row.Q_COMPETENT_DEPT_NAME }}
</span>
<span v-else>{{ row.MANAGER_DEPARTMENT_NAME }}</span>
</template>
</el-table-column>
<el-table-column prop="DEPARTMENT_NAME" label="监管部门">
<template v-slot="{ row }">
<span v-if="row.Q_DEPARTMENT_NAME">
{{ row.Q_DEPARTMENT_NAME }}
</span>
<span v-else>{{ row.DEPARTMENT_NAME }}</span>
</template>
</el-table-column>
<el-table-column prop="MANAGE_CORPS_NAME" label="监理单位" />
<el-table-column prop="STATE" label="状态">
<template v-slot="{ row }">
<span v-if="row.STATE === '1'"></span>
<span v-if="row.STATE === '2'"></span>
</template>
</el-table-column>
<el-table-column prop="OUTSOURCED_CREATOR_NAME" label="创建人" />
<el-table-column label="操作" align="center" width="200">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/outsourced/view',
query: {
outsourcedId: row.OUTSOURCED_ID,
},
})
"
>
查看
</el-button>
<el-button type="primary" text link v-if="row.STATE === '1'">
结束
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/outsourced/add',
query: {
type: 'edit',
outsourcedId: row.OUTSOURCED_ID,
},
})
"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="fnHandleDelete(row.OUTSOURCED_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
type="primary"
@click="
router.push({
path: '/keyprojects/outsourced/add',
query: {
type: 'add',
},
})
"
>
新增
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import {
getOutsourcedList,
getUnitsListAll,
setOutsourcedDelete,
} from "@/request/keyprojects.js";
import { reactive } from "vue";
import router from "@/router";
import { ElMessageBox } from "element-plus";
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getOutsourcedList);
const data = reactive({
unitsList: [],
});
const fnGetUnitsList = async () => {
const resData = await getUnitsListAll({});
data.unitsList = resData.varList;
};
fnGetUnitsList();
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
const fnHandleDelete = async (OUTSOURCED_ID) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setOutsourcedDelete({ OUTSOURCED_ID });
fnGetData();
};
</script>
<style scoped></style>

View File

@ -0,0 +1,108 @@
<template>
<div>
<layout-card>
<div id="printContent">
<el-divider content-position="left">工程信息</el-divider>
<el-descriptions border :column="2">
<el-descriptions-item label="重点工程名称" :span="2">
{{ data.info.OUTSOURCED_NAME }}
</el-descriptions-item>
<el-descriptions-item
label="股份主管部门"
v-if="data.info.IS_CORP_TYPE === '0'"
>
{{ data.info.MANAGER_DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item
label="股份监管部门"
v-if="data.info.IS_CORP_TYPE === '0'"
>
{{ data.info.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item
:span="2"
label="辖区单位"
v-if="data.info.IS_CORP_TYPE === '0'"
>
{{ data.info.JURISDICTION_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="企业监督部门">
{{ data.info.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="企业辖区部门" :span="2">
{{ data.info.INVOLVING_CORPS_DEPART_NAME }}
</el-descriptions-item>
<el-descriptions-item label="集团单位" :span="2">
{{ data.info.GROUP_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="计划工期" :span="2">
{{ data.info.STARTTIME }} {{ data.info.ENDTIME }}
</el-descriptions-item>
<el-descriptions-item label="施工相关方" :span="2">
{{ data.info.UNITS_NAME }}
</el-descriptions-item>
<el-descriptions-item label="合同号">
{{ data.info.CONTRACT_NUM }}
</el-descriptions-item>
<el-descriptions-item label="监理单位名称">
{{ data.info.MANAGE_CORPS_NAME }}
</el-descriptions-item>
<el-descriptions-item label="相关方单位工程负责人">
{{ data.info.UNITS_PIC_NAME }}
</el-descriptions-item>
<el-descriptions-item label="相关方单位负责人手机">
{{ data.info.UNITS_PHONE }}
</el-descriptions-item>
<el-descriptions-item label="监理单位工程负责人">
{{ data.info.MANAGE_PIC }}
</el-descriptions-item>
<el-descriptions-item label="监理单位负责人手机">
{{ data.info.MANAGE_PHONE }}
</el-descriptions-item>
<el-descriptions-item label="是否发送短信">
{{ data.info.IS_SMS === "0" ? "是" : "否" }}
</el-descriptions-item>
<el-descriptions-item label="状态">
{{ data.info.STATE === "1" ? "进行中" : "已结束" }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">处罚相关</el-divider>
<el-descriptions border :column="2">
<div v-for="(item, index) in punishThePerson" :key="index">
<el-descriptions-item label="处罚人员部门">
{{ item.punishname }}
</el-descriptions-item>
<el-descriptions-item label="处罚人员">
{{ item.NAME }}
</el-descriptions-item>
</div>
</el-descriptions>
</div></layout-card
>
</div>
</template>
<script setup>
import { setOutsourcedGoEdit } from "@/request/keyprojects";
import { reactive } from "vue";
import { useRoute } from "vue-router";
const route = useRoute();
const data = reactive({
info: {},
punishThePerson: [],
file: {},
});
const fnGetData = async () => {
const resData = await setOutsourcedGoEdit({
OUTSOURCED_ID: route.query.outsourcedId,
});
data.info = resData.pd;
data.punishThePerson = resData.punishThePerson;
data.file = resData.file9;
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,172 @@
<template>
<el-dialog v-model="visible" :title="title" width="600" :on-close="fnClose">
<el-form ref="formRef" :rules="rules" :model="form" label-width="110px">
<el-form-item label="单位名称" prop="UNITS_ID">
<el-select
:disabled="type === 'view'"
v-model="form.UNITS_ID"
placeholder="请选择状态"
>
<el-option
v-for="item in data.unitsnameList"
:key="item.UNITS_ID"
:label="item.UNITS_NAME"
:value="item.UNITS_ID"
/>
</el-select>
</el-form-item>
<el-form-item label="作业类别">
<el-select
:disabled="type === 'view'"
v-model="form.JOB_TYPE"
placeholder="请选择状态"
>
<el-option
v-for="item in jobtypeList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
<el-form-item label="操作项目">
<el-input v-model="form.OPERATIONITEM" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="手机号码" prop="PHONENUM">
<el-input v-model="form.PHONENUM" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="姓名" prop="NAME">
<el-input v-model="form.NAME" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="性别">
<el-select
:disabled="type === 'view'"
v-model="form.SEX"
placeholder="请选择性别"
>
<el-option label="男" value="0" />
<el-option label="女" value="1" />
</el-select>
</el-form-item>
<el-form-item label="作业证书编号">
<el-input v-model="form.CERTIFICATE_NUM" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="复审时间">
<el-input v-model="form.REVIEWTIME" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="身份证号码">
<el-input v-model="form.IDENTITYCARD" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="发证机关">
<el-input v-model="form.LICENSING" :disabled="type === 'view'" />
</el-form-item>
<el-form-item label="有效期">
<el-date-picker
:disabled="type === 'view'"
v-model="form.VALID_TIME"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"> </el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { layoutFnGetPersonnelmanagementJobType } from "@/assets/js/data_dictionary";
import {
getUnitsListAll,
setPersonnelmanagementAdd,
setPersonnelmanagementEdit,
} from "@/request/keyprojects";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
form: {
type: Object,
required: true,
default: () => ({}),
},
type: {
type: String,
required: true,
default: () => "",
},
title: {
type: String,
required: true,
default: () => "",
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
UNITS_ID: [{ required: true, message: "请选择单位名称", trigger: "change" }],
NAME: [{ required: true, message: "请输入姓名", trigger: "blur" }],
PHONENUM: [
{ required: true, message: "请输入手机号码", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
};
const data = reactive({
unitsnameList: [],
});
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
if (form.VALID_TIME && form.VALID_TIME.length !== 0) {
form.VALID_STIME = form.VALID_TIME[0];
form.VALID_ETIME = form.VALID_TIME[1];
}
props.type === "add"
? await setPersonnelmanagementAdd(props.form)
: await setPersonnelmanagementEdit(props.form);
ElMessage.success("提交成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
const jobtypeList = await layoutFnGetPersonnelmanagementJobType();
const fnUnitsListAll = async () => {
const resData = await getUnitsListAll();
data.unitsnameList = resData.varList;
};
fnUnitsListAll();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,216 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="作业类别" prop="JOB_TYPE">
<el-select
v-model="searchForm.JOB_TYPE"
clearable
placeholder="请选择状态"
>
<el-option
v-for="item in jobtypeList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CREATOR_CORP_NAME" label="添加单位" />
<el-table-column prop="CREATOR_NAME" label="添加人" width="200" />
<el-table-column prop="UNITS_NAME" label="单位名称" width="150" />
<el-table-column prop="JOBTYPE" label="作业类别" width="100" />
<el-table-column prop="OPERATIONITEM" label="操作项目" />
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="SEX" label="性别" />
<el-table-column prop="CERTIFICATE_NUM" label="作业证书编号" />
<el-table-column prop="REVIEWTIME" label="复审时间" />
<el-table-column label="操作" align="center" width="240">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="resetPwd(row.PERSONNELMANAGEMENT_ID, row.NAME)"
>
重置密码
</el-button>
<el-button
type="primary"
text
link
@click="fnView(row.PERSONNELMANAGEMENT_ID)"
>
查看
</el-button>
<el-button
type="primary"
text
link
@click="fnEdit(row.PERSONNELMANAGEMENT_ID)"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="handleDelete(row.PERSONNELMANAGEMENT_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAdd(row)"> </el-button>
<el-button type="danger" @click="batchDel()"> </el-button>
</template>
</layout-table>
</layout-card>
<edit
v-model:visible="data.editDialog.visible"
v-model:form="data.editDialog.form"
:type="data.editDialog.type"
:title="data.editDialog.title"
@get-data="fnResetPaginationTransfer"
/>
</div>
</template>
<script setup>
import { layoutFnGetPersonnelmanagementJobType } from "@/assets/js/data_dictionary";
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import {
getPersonnelmanagementList,
setPersonnelmanagementResetPwd,
setPersonnelmanagementGoEdit,
setPersonnelmanagementDelete,
setPersonnelmanagementDeleteAll,
} from "@/request/keyprojects.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive } from "vue";
import Edit from "./components/edit.vue";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getPersonnelmanagementList);
const jobtypeList = await layoutFnGetPersonnelmanagementJobType();
const data = reactive({
type: "",
title: "",
editDialog: {
visible: false,
form: {},
},
});
const resetPwd = async (PERSONNELMANAGEMENT_ID, NAME) => {
await ElMessageBox.confirm(
"是否将[" + NAME + "]的密码重置为 Aa@123456789 吗?",
{
type: "warning",
}
);
await setPersonnelmanagementResetPwd({ PERSONNELMANAGEMENT_ID });
ElMessage.success("重置成功");
};
const handleDelete = async (PERSONNELMANAGEMENT_ID) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setPersonnelmanagementDelete({ PERSONNELMANAGEMENT_ID });
fnGetData();
};
const batchDel = async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
const ids = selectionData
.map((item) => {
return item.PERSONNELMANAGEMENT_ID;
})
.join(",");
await setPersonnelmanagementDeleteAll({ DATA_IDS: ids });
fnGetData();
};
const fnGoEdit = async (id) => {
const resData = await setPersonnelmanagementGoEdit({
PERSONNELMANAGEMENT_ID: id,
});
data.editDialog.form = resData.pd;
};
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
const fnAdd = () => {
data.editDialog.form = {};
data.editDialog.visible = true;
data.editDialog.type = "add";
data.editDialog.title = "新增";
};
const fnEdit = async (id) => {
data.editDialog.form = {};
data.editDialog.visible = true;
data.editDialog.type = "edit";
data.editDialog.title = "编辑";
fnGoEdit(id);
};
const fnView = async (id) => {
data.editDialog.form = {};
data.editDialog.visible = true;
data.editDialog.type = "view";
data.editDialog.title = "查看";
fnGoEdit(id);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,92 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="OUTSOURCED_NAME" label="重点工程名称" />
<el-table-column prop="DEPARTMENT_NAME" label="监管部门" width="200" />
<el-table-column
prop="MANAGE_CORPS_NAME"
label="监理单位"
width="200"
/>
<el-table-column
prop="UNITS_PIC_NAME"
label="相关方单位负责人"
width="200"
/>
<el-table-column prop="UNITS_PHONE" label="电话" />
<el-table-column prop="CHECK_COUNT" label="安全环保检查次数" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/punish/record_list',
query: {
OUTSOURCED_ID: row.OUTSOURCED_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getOutsourcedList } from "@/request/keyprojects.js";
import router from "@/router";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getOutsourcedList);
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,106 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="处罚状态">
<el-select v-model="searchForm.HANDLED">
<el-option label="待反馈处罚" value="1" />
<el-option label="已完成处罚" value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="OUTSOURCED_NAME" label="重点工程名称" />
<el-table-column prop="REASON" label="处罚原因" width="200" />
<el-table-column prop="CREATOR_NAME" label="下发人" width="150" />
<el-table-column
prop="OUTSOURCED_NAME"
label="被处罚单位"
width="100"
/>
<el-table-column prop="PERSON_NAME" label="被处罚人" />
<el-table-column label="处罚处理状态">
<template v-slot="{ row }">
{{ row.HANDLED === "0" ? "待处理" : "已处理" }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/inspection/record_view',
query: {
KEYPROJECTPUNISH_ID: row.KEYPROJECTPUNISH_ID,
},
})
"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import { getKeyprojectpunishList } from "@/request/keyprojects.js";
import router from "@/router";
import { useRoute } from "vue-router";
const route = useRoute();
const { OUTSOURCED_ID } = route.query;
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getKeyprojectpunishList, {
otherParams: { OUTSOURCED_ID },
});
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,59 @@
<template>
<div>
<layout-card>
<div id="printContent">
<el-divider content-position="left">检查信息</el-divider>
<el-descriptions border>
<el-descriptions-item label="处罚原因 ">
{{ data.info.REASON }}
</el-descriptions-item>
<el-descriptions-item label="处罚金额">
{{ data.info.AMOUT }}
</el-descriptions-item>
<el-descriptions-item label="被处罚单位 ">
{{ data.info.OUTSOURCED_NAME }}
</el-descriptions-item>
<el-descriptions-item label="被处罚人">
{{ data.info.PERSON_NAME }}
</el-descriptions-item>
<el-descriptions-item label="下发人 ">
{{ data.info.CREATOR_NAME }}
</el-descriptions-item>
<el-descriptions-item label="下发处罚时间">
{{ data.info.DATE }}
</el-descriptions-item>
<el-descriptions-item label="罚款缴纳单 ">
{{ data.info.INSPECTION_TIME_START }}
</el-descriptions-item>
<el-descriptions-item label="处罚处理人">
{{ data.info.PERSON_NAME }}
</el-descriptions-item>
<el-descriptions-item label="处罚处理时间">
{{ data.info.HANLDE_TIME }}
</el-descriptions-item>
</el-descriptions>
</div>
</layout-card>
</div>
</template>
<script setup>
import { getKeyprojectpunishGoEdit } from "@/request/keyprojects";
import { reactive } from "vue";
import { useRoute } from "vue-router";
const route = useRoute();
const data = reactive({
info: {},
});
const fnGetData = async () => {
const resData = await getKeyprojectpunishGoEdit({
KEYPROJECTPUNISH_ID: route.query.KEYPROJECTPUNISH_ID,
});
data.info = resData.pd;
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,107 @@
<template>
<layout-card>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-row>
<el-col :span="12">
<el-form-item label="相关方单位名称" prop="UNITS_NAME">
<el-input v-model="data.form.UNITS_NAME" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="CODE">
<el-input v-model="data.form.CODE" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="CONTACTS">
<el-input v-model="data.form.CONTACTS" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人电话" prop="CONTACTS_PHONE">
<el-input
v-model="data.form.CONTACTS_PHONE"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"> </el-button>
</div>
</layout-card>
</template>
<script setup>
import useFormValidate from "@/assets/js/useFormValidate";
import {
setUnitsAdd,
setUnitsEdit,
setUnitsGoEdit,
} from "@/request/keyprojects";
import { ElMessage } from "element-plus";
import { debounce } from "throttle-debounce";
import { reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
const formRef = ref(null);
const rules = {
UNITS_NAME: [
{ required: true, message: "请输入相关方单位名称", trigger: "blur" },
],
CODE: [
{ required: true, message: "请输入统一社会信用代码", trigger: "blur" },
{
pattern: /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/,
message: "请输入正确的统一社会信用代码",
},
],
CONTACTS: [{ required: true, message: "请输入联系人", trigger: "blur" }],
CONTACTS_PHONE: [
{ required: true, message: "请输入联系人电话", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
};
const data = reactive({
form: [],
});
const fnGoEdit = async () => {
const resData = await setUnitsGoEdit({ UNITS_ID: route.query.UNITS_ID });
data.form = resData.pd;
};
if (route.query.type === "edit") fnGoEdit();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
route.query.type === "edit"
? await setUnitsEdit(formData)
: await setUnitsAdd(formData);
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,179 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="UNITS_NAME"
label="相关方单位名称"
show-overflow-tooltip
/>
<el-table-column prop="CODE" label="统一社会信用代码" width="200" />
<el-table-column
prop="CONTACTS"
label="联系人"
width="150"
show-overflow-tooltip
/>
<el-table-column prop="CONTACTS_PHONE" label="联系人电话" width="100" />
<el-table-column
prop="CORP_NAME"
label="创建单位"
show-overflow-tooltip
/>
<el-table-column
prop="CREATOR_NAME"
label="创建人"
show-overflow-tooltip
/>
<el-table-column label="操作" align="center" width="140">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/keyprojects/units/add',
query: {
type: 'edit',
UNITS_ID: row.UNITS_ID,
},
})
"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="isTrueDelete(row.UNITS_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
type="primary"
@click="
router.push({
path: '/keyprojects/units/add',
query: {
type: 'add',
},
})
"
>
新增
</el-button>
<el-button type="danger" @click="isTrueDeleteAll">
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import {
getUnitsList,
setIsTrueDelete,
setIsTrueDeleteAll,
setUnitsDelete,
setUnitsDeleteAll,
} from "@/request/keyprojects.js";
import router from "@/router";
import { ElMessage, ElMessageBox } from "element-plus";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getUnitsList);
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
const isTrueDelete = async (UNITS_ID) => {
const resData = await setIsTrueDelete({ UNITS_ID });
if (resData.result === "success" && resData.number === 0) {
handleDelete(UNITS_ID);
} else {
ElMessage.info("相关方下还有人员不能进行删除");
}
};
const isTrueDeleteAll = async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const ids = selectionData
.map((item) => {
return item.UNITS_ID;
})
.join(",");
const resData = await setIsTrueDeleteAll({ UNITS_ID: ids });
if (resData.result === "success" && resData.number === 0) {
batchDel(ids);
} else {
ElMessage.warning("相关方下还有人员不能进行删除");
}
};
const batchDel = async (ids) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setUnitsDeleteAll({ DATA_IDS: ids });
fnGetData();
};
const handleDelete = async (UNITS_ID) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setUnitsDelete({ UNITS_ID });
fnGetData();
};
</script>
<style scoped></style>

View File

@ -0,0 +1,106 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="4">
<el-form-item label="关键字搜索" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
row-key="UNITS_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CREATOR_CORP_NAME" label="添加单位" />
<el-table-column prop="CREATOR_NAME" label="添加人" width="200" />
<el-table-column prop="UNITS_NAME" label="单位名称" width="150" />
<el-table-column prop="JOBTYPE" label="作业类别" width="100" />
<el-table-column prop="OPERATIONITEM" label="操作项目" />
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="SEX" label="性别" />
<el-table-column prop="CERTIFICATE_NUM" label="作业证书编号" />
<el-table-column prop="REVIEWTIME" label="复审时间" />
<el-table-column label="操作" align="center" width="120">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnView(row.PERSONNELMANAGEMENT_ID)"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData";
import { serialNumber } from "@/assets/js/utils";
import {
getPersonnelmanagementList,
setPersonnelmanagementGoEdit,
} from "@/request/keyprojects.js";
import { reactive } from "vue";
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getPersonnelmanagementList);
const data = reactive({
type: "",
title: "",
editDialog: {
visible: false,
form: {},
},
});
const fnGoEdit = async (id) => {
const resData = await setPersonnelmanagementGoEdit({
PERSONNELMANAGEMENT_ID: id,
});
data.editDialog.form = resData.pd;
};
const fnResetPaginationTransfer = () => {
fnGetData(searchForm);
};
const fnView = async (id) => {
data.editDialog.form = {};
data.editDialog.visible = true;
data.editDialog.type = "view";
data.editDialog.title = "查看";
fnGoEdit(id);
};
</script>
<style scoped></style>

View File

@ -0,0 +1,154 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="申请人" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="离岗状态" prop="REVIEW_STATUS">
<el-select v-model="searchForm.REVIEW_STATUS">
<el-option
v-for="item in reviewStatusList"
:key="item.ID"
:value="item.ID"
:label="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审批人" prop="REVIEW_USER_NAME">
<el-input v-model="searchForm.REVIEW_USER_NAME" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="离岗时间" prop="dates">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="申请人部门">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="DEPARTMENTNAME_ALL" label="部门" />
<el-table-column prop="POSTNAME" label="岗位" />
<el-table-column prop="USER_NAME" label="姓名" />
<el-table-column label="申请状态">
<template v-slot="{ row }">
<span v-if="row.REVIEW_STATUS === '0'"></span>
<span v-else-if="row.REVIEW_STATUS === '1'">审批通过</span>
<span
v-else-if="row.ISDELETE === '1' && row.REVIEW_STATUS === '-1'"
>
<span v-if="row.CREATOR === row.OPERATOR"></span>
<span v-else></span>
</span>
<span v-else-if="row.REVIEW_STATUS === '-1'">审批打回</span>
<span v-else-if="row.REVIEW_STATUS === '2'">无需审批</span>
</template>
</el-table-column>
<el-table-column label="离岗时间">
<template v-slot="{ row }">
<span>{{ row.STARTTIME }} {{ row.ENDTIME }}</span>
</template>
</el-table-column>
<el-table-column label="指定审批人">
<template v-slot="{ row }">
<span v-if="row.REVIEW_USER_ID">
{{
row.REVIEW_USER_NAME +
" [" +
row.REVIEW_USER_DEPARTMENTNAME +
"]"
}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button type="primary" text link @click="fnView(row)">
查看
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import { getRecordList } from "@/request/off_duty_management.js";
import LayoutDepartment from "@/components/department/index.vue";
const reviewStatusList = [
{ ID: "0", NAME: "待审批" },
{ ID: "1", NAME: "审批通过" },
{ ID: "-1", NAME: "审批打回" },
{ ID: "2", NAME: "无需审批" },
{ ID: "3", NAME: "申请人取消" },
{ ID: "4", NAME: "审批人取消" },
];
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getRecordList, { otherParams: { TYPE: "show" } });
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
</script>
<style scoped></style>

View File

@ -0,0 +1,56 @@
<template>
<layout-card>
<layout-table :data="list" :show-pagination="false">
<el-table-column label="序号" width="60" type="index" />
<el-table-column prop="CORP_NAME" label="企业名称" />
<el-table-column label="离岗是否审批" width="260">
<template #default="{ row }">
<el-switch
v-model="SETUP_STATE"
active-text="是"
inactive-text="否"
active-value="2"
inactive-value="1"
active-color="#13ce66"
inactive-color="#ff4949"
@change="fnChange(row)"
/>
</template>
</el-table-column>
</layout-table>
</layout-card>
</template>
<script setup>
import useListData from "@/assets/js/useListData.js";
import {
getSettingList,
setSettingChange,
} from "@/request/off_duty_management.js";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
const SETUP_STATE = ref("");
const { list, fnResetPagination } = useListData(getSettingList, {
usePagination: false,
callbackFn: (list) => {
if (list.length > 0) SETUP_STATE.value = list[0].SETUP_STATE;
},
});
const fnChange = debounce(
1000,
async (row) => {
await setSettingChange({
OFFDUTY_SETUP_ID: row.OFFDUTY_SETUP_ID,
CORPINFO_ID: row.CORPINFO_ID,
SETUP_STATE: SETUP_STATE.value,
});
ElMessage.success("设置成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,518 @@
<template>
<layout-card>
<el-form
ref="formRef"
:rules="rules"
:model="data.form"
label-width="120px"
>
<el-row>
<el-col :span="12">
<el-form-item label="承诺书名称" prop="PROMISE_NAME">
<el-input v-model="data.form.PROMISE_NAME" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="级别" prop="LEVEL">
<el-select v-model="data.form.LEVEL">
<el-option
v-for="item in commitmentLevelList"
:key="item.DICTIONARIES_ID"
:value="item.BIANMA"
:label="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="适用期限开始" prop="PROMISE_TERM_START">
<el-date-picker
v-model="data.form.PROMISE_TERM_START"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="适用期限结束" prop="PROMISE_TERM_END">
<el-date-picker
v-model="data.form.PROMISE_TERM_END"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-divider content-position="left">承诺人</el-divider>
</el-col>
<el-col :span="24">
<el-form-item class="end">
<el-button type="primary" @click="fnAddPeople"></el-button>
</el-form-item>
</el-col>
<template v-for="(item, index) in data.form.people" :key="item.id">
<el-col :span="8">
<el-form-item
:label="'部门' + (index + 1)"
:prop="'people.' + index + '.DEPARTMENT_ID'"
:rules="{
required: true,
message: '部门不能为空',
trigger: 'blur',
}"
>
<layout-department
v-model="item.DEPARTMENT_ID"
@update:model-value="
fnDepartmentChange($event, index, 'people')
"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label="'岗位' + (index + 1)"
:prop="'people.' + index + '.POST_ID'"
:rules="{
required: true,
message: '岗位不能为空',
trigger: 'blur',
}"
>
<el-select
:model-value="item.POST_ID"
@change="fnPostChange($event, index, 'people')"
>
<el-option
v-for="item in item.postList"
:key="item.POST_ID"
:label="item.NAME"
:value="item.POST_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label="'人员' + (index + 1)"
:prop="'people.' + index + '.USER_ID'"
:rules="{
required: true,
message: '人员不能为空',
trigger: 'blur',
}"
>
<div
style="
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
"
>
<el-select v-model="item.USER_ID" multiple>
<el-option
v-for="item in item.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
<el-button
v-if="index !== 0"
class="ml-10"
type="danger"
@click="data.form.people.splice(index, 1)"
>
删除
</el-button>
</div>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-divider content-position="left">被承诺人</el-divider>
</el-col>
<!-- <el-col :span="24">-->
<!-- <el-form-item class="end">-->
<!-- <el-button type="primary" @click="fnAddCoverPeople"></el-button>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<template v-for="(item, index) in data.form.coverpeople" :key="item.id">
<el-col :span="8">
<el-form-item
:label="'部门' + (index + 1)"
:prop="'coverpeople.' + index + '.DEPARTMENT_ID'"
:rules="{
required: true,
message: '部门不能为空',
trigger: 'blur',
}"
>
<layout-department
v-model="item.DEPARTMENT_ID"
@update:model-value="
fnDepartmentChange($event, index, 'coverpeople')
"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label="'岗位' + (index + 1)"
:prop="'coverpeople.' + index + '.POST_ID'"
:rules="{
required: true,
message: '岗位不能为空',
trigger: 'blur',
}"
>
<el-select
:model-value="item.POST_ID"
@change="fnPostChange($event, index, 'coverpeople')"
>
<el-option
v-for="item in item.postList"
:key="item.POST_ID"
:label="item.NAME"
:value="item.POST_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label="'人员' + (index + 1)"
:prop="'coverpeople.' + index + '.USER_ID'"
:rules="{
required: true,
message: '人员不能为空',
trigger: 'blur',
}"
>
<div
style="
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
"
>
<el-select v-model="item.USER_ID" multiple :multiple-limit="1">
<el-option
v-for="item in item.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
<!-- <el-button-->
<!-- v-if="index !== 0"-->
<!-- class="ml-10"-->
<!-- type="danger"-->
<!-- @click="data.form.coverpeople.splice(index, 1)"-->
<!-- >-->
<!-- 删除-->
<!-- </el-button>-->
</div>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-divider content-position="left">承诺书内容</el-divider>
</el-col>
<el-col :span="24">
<el-form-item class="end">
<el-button type="primary" @click="fnSelectTemplate">
选择模板
</el-button>
</el-form-item>
</el-col>
<template v-if="data.isSelectTemplate">
<el-col :span="24">
<el-form-item label="正文" prop="TEXT">
<el-input
v-model="data.form.TEXT"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="end">
<el-button type="primary" @click="fnAddCollateral">
新增副文
</el-button>
</el-form-item>
</el-col>
<el-col
v-for="(item, index) in data.form.DETAIL"
:key="item.id"
:span="24"
>
<el-form-item
:label="'副文' + (index + 1)"
:prop="'DETAIL.' + index + '.value'"
:rules="{
required: true,
message: '副文不能为空',
trigger: 'blur',
}"
>
<div
style="
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
"
>
<el-input
v-model="item.value"
type="textarea"
:autosize="{ minRows: 3 }"
/>
<el-button
v-if="index !== 0"
class="ml-10"
type="danger"
@click="data.form.DETAIL.splice(index, 1)"
>
删除
</el-button>
</div>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
<div class="mt-10 tc">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
<select-template
v-model:visible="data.selectTemplateDialogVisible"
@check="fnSelectTemplateSubmit"
/>
</layout-card>
</template>
<script setup>
import { reactive, ref } from "vue";
import { layoutFnGetCommitmentLevel } from "@/assets/js/data_dictionary.js";
import LayoutDepartment from "@/components/department/index.vue";
import { getPostListAll, getUserListAll } from "@/request/data_dictionary.js";
import { verifyDuplicateSelection } from "@/assets/js/utils.js";
import SelectTemplate from "./components/select_template.vue";
import { debounce } from "throttle-debounce";
import { useRoute, useRouter } from "vue-router";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import {
getAdministrationView,
setAdministrationAdd,
setAdministrationEdit,
} from "@/request/security_commitment_pro.js";
import dayjs from "dayjs";
import { uniqBy } from "lodash-es";
const route = useRoute();
const router = useRouter();
const { PROMISE_ID } = route.query;
const rules = {
PROMISE_NAME: [
{ required: true, message: "承诺书名称不能为空", trigger: "blur" },
],
LEVEL: [{ required: true, message: "级别不能为空", trigger: "change" }],
PROMISE_TERM_START: [
{ required: true, message: "适用期限开始不能为空", trigger: "change" },
],
PROMISE_TERM_END: [
{ required: true, message: "适用期限结束不能为空", trigger: "change" },
],
TEXT: [{ required: true, message: "正文不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const data = reactive({
form: {
PROMISE_NAME: "",
LEVEL: "",
PROMISE_TERM_START: dayjs().format("YYYY-MM-DD"),
PROMISE_TERM_END: dayjs().format("YYYY-MM-DD"),
people: [],
coverpeople: [],
TEXT: "",
DETAIL: [],
},
selectTemplateDialogVisible: false,
isSelectTemplate: false,
});
const commitmentLevelList = await layoutFnGetCommitmentLevel();
const fnAddPeople = () => {
data.form.people.push({
postList: [],
userList: [],
DEPARTMENT_ID: "",
POST_ID: "",
USER_ID: [],
id: Math.random(),
});
};
const fnAddCoverPeople = () => {
data.form.coverpeople.push({
postList: [],
userList: [],
DEPARTMENT_ID: "",
POST_ID: "",
USER_ID: [],
id: Math.random(),
});
};
const fnGetData = async () => {
if (!PROMISE_ID) {
fnAddPeople();
fnAddCoverPeople();
return;
}
const resData = await getAdministrationView({ PROMISE_ID });
const DETAIL = resData.promistDetail.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
const people = resData.people;
const coverpeople = resData.coverpeople;
const newPeople = [];
const newCoverpeople = [];
for (let i = 0; i < people.length; i++) {
newPeople.push({
...people[i],
postList: [],
userList: [],
USER_ID: [],
id: people[i].PROMISEPEOPLE_ID,
});
for (let j = 0; j < newPeople.length; j++) {
if (people[i].POST_ID === newPeople[j].POST_ID) {
newPeople[j].USER_ID.push(people[i].USER_ID);
}
}
}
for (let i = 0; i < coverpeople.length; i++) {
newCoverpeople.push({
...coverpeople[i],
postList: [],
userList: [],
USER_ID: [],
id: coverpeople[i].PROMISEPEOPLE_ID,
});
for (let j = 0; j < newCoverpeople.length; j++) {
if (coverpeople[i].POST_ID === newCoverpeople[j].POST_ID) {
newCoverpeople[j].USER_ID.push(coverpeople[i].USER_ID);
}
}
}
data.form = {
...resData.varList,
DETAIL,
people: uniqBy(newPeople, "POST_ID"),
coverpeople: uniqBy(newCoverpeople, "POST_ID"),
};
data.isSelectTemplate = true;
for (let i = 0; i < data.form.people.length; i++) {
await fnGetPostList(data.form.people[i].DEPARTMENT_ID, i, "people");
await fnGetUserList(
data.form.people[i].DEPARTMENT_ID,
data.form.people[i].POST_ID,
i,
"people"
);
}
for (let i = 0; i < data.form.coverpeople.length; i++) {
await fnGetPostList(
data.form.coverpeople[i].DEPARTMENT_ID,
i,
"coverpeople"
);
await fnGetUserList(
data.form.coverpeople[i].DEPARTMENT_ID,
data.form.coverpeople[i].POST_ID,
i,
"coverpeople"
);
}
};
fnGetData();
const fnDepartmentChange = (value, index, key) => {
data.form[key][index].POST_ID = "";
data.form[key][index].USER_ID = [];
data.form[key][index].postList = [];
data.form[key][index].userList = [];
fnGetPostList(value, index, key);
};
const fnGetPostList = async (DEPARTMENT_ID, index, key) => {
const resData = await getPostListAll({ DEPARTMENT_ID });
data.form[key][index].postList = resData.postList;
};
const fnPostChange = async (value, index, key) => {
await verifyDuplicateSelection(data.form[key], index, "POST_ID", value);
data.form[key][index].USER_ID = [];
data.form[key][index].userList = [];
await fnGetUserList(data.form[key][index].DEPARTMENT_ID, value, index, key);
};
const fnGetUserList = async (DEPARTMENT_ID, POST_ID, index, key) => {
const resData = await getUserListAll({ DEPARTMENT_ID, POST_ID });
data.form[key][index].userList = resData.userList;
};
const fnSelectTemplate = () => {
data.selectTemplateDialogVisible = true;
};
const fnSelectTemplateSubmit = (row) => {
data.form.DETAIL = row.DETAIL;
data.form.TEXT = row.TEXT;
data.form.TYPE = row.TYPE;
data.isSelectTemplate = true;
};
const fnAddCollateral = () => {
data.form.DETAIL.push({ value: "", id: Math.random() });
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
if (!data.isSelectTemplate) {
ElMessage.warning("请选择模板");
return;
}
const DETAIL = data.form.DETAIL.map((item, index) => ({
value: item.value,
index,
}));
const people = data.form.people.map((item) => ({
DEPARTMENT_ID: item.DEPARTMENT_ID,
POST_ID: item.POST_ID,
USER_ID: item.USER_ID,
}));
const coverpeople = data.form.coverpeople.map((item) => ({
DEPARTMENT_ID: item.DEPARTMENT_ID,
POST_ID: item.POST_ID,
USER_ID: item.USER_ID,
}));
const params = {
...data.form,
DETAIL: JSON.stringify(DETAIL),
people: JSON.stringify(people),
coverpeople: JSON.stringify(coverpeople),
PROMISE_ID,
};
!PROMISE_ID
? await setAdministrationAdd(params)
: await setAdministrationEdit(params);
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,99 @@
<template>
<el-dialog v-model="visible" title="选择模板">
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="8">
<el-form-item label="承诺书名称" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="PROMISE_NAME" label="承诺书名称" />
<el-table-column label="类型">
<template v-slot="{ row }">
{{ row.TYPE === "0" ? "承诺书" : "责任状" }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200">
<template v-slot="{ row }">
<el-button type="primary" text link @click="fnCheck(row)">
选择
</el-button>
</template>
</el-table-column>
</layout-table>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import useListData from "@/assets/js/useListData.js";
import {
getAdministrationSelectTemplateCheck,
getAdministrationSelectTemplateList,
} from "@/request/security_commitment_pro.js";
import { serialNumber } from "@/assets/js/utils.js";
import { watch } from "vue";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
});
const emits = defineEmits(["update:visible", "check"]);
const visible = useVModel(props, "visible", emits);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getAdministrationSelectTemplateList, {
immediate: false,
});
const fnClose = () => {
visible.value = false;
};
const fnCheck = async (row) => {
const resData = await getAdministrationSelectTemplateCheck({
PROMISE_ID: row.PROMISE_ID,
});
const DETAIL = resData.varList.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
fnClose();
emits("check", { DETAIL, TEXT: row.TEXT, TYPE: row.TYPE });
};
const stop = watch(visible, (val) => {
if (val) {
fnGetData();
stop && stop();
}
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,85 @@
<template>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="DEPTNAME" label="部门" />
<el-table-column prop="POST_NAME" label="岗位" />
<el-table-column prop="USERNAME" label="人员" />
<el-table-column prop="SIGNTIME" label="签署时间" />
<el-table-column label="状态">
<template v-slot="{ row }">
{{ row.ISSIGN === 0 ? "未签署" : "已签署" }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnView(row.PROMISEPEOPLE_ID)"
>
查看
</el-button>
</template>
</el-table-column>
</layout-table>
<view-info
v-model:visible="data.viewDialog.visible"
:info="data.viewDialog.info"
/>
</layout-card>
</template>
<script setup>
import { useRoute } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import {
getAdministrationDetailsList,
getAdministrationDetailsView,
} from "@/request/security_commitment_pro.js";
import { serialNumber } from "@/assets/js/utils.js";
import { reactive } from "vue";
import ViewInfo from "../template/components/view.vue";
const route = useRoute();
const { PROMISE_ID } = route.query;
const { list, pagination, fnGetData } = useListData(
getAdministrationDetailsList,
{ otherParams: { PROMISE_ID } }
);
const data = reactive({
viewDialog: {
visible: false,
info: {},
},
});
const fnView = async (PROMISEPEOPLE_ID) => {
const resData = await getAdministrationDetailsView({
PROMISEPEOPLE_ID,
PROMISE_ID,
});
const DETAIL = resData.COLLATERAL.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
data.viewDialog.info = {
...resData.varList,
DETAIL,
FILEPATH: resData.ISGN.FILEPATH,
SIGNTIME: resData.ISGN.SIGNTIME,
COVERPEOPLE: resData.COVERPEOPLE[0].USERNAME,
};
data.viewDialog.visible = true;
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,193 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="承诺书名称" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="级别" prop="LEVEL">
<el-select v-model="searchForm.LEVEL">
<el-option
v-for="item in commitmentLevelList"
:key="item.DICTIONARIES_ID"
:value="item.BIANMA"
:label="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPTIDS">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="PROMISE_NAME" label="承诺书名称" />
<el-table-column prop="LEVELNAME" label="级别" />
<el-table-column prop="CREATTIME" label="添加时间" width="150" />
<el-table-column label="适用期限" width="180">
<template v-slot="{ row }">
{{ row.PROMISE_TERM_START + "至" + row.PROMISE_TERM_END }}
</template>
</el-table-column>
<el-table-column prop="DEPTNAME" label="涉及部门" />
<el-table-column prop="POSTNAME" label="涉及岗位" />
<el-table-column label="承诺人数/涉及人数">
<template v-slot="{ row }">
{{ row.ISSIGN }}/{{ row.PEOPLENUM_INVOLVED }}
</template>
</el-table-column>
<el-table-column label="状态" width="80">
<template v-slot="{ row }">
{{ row.STATE === "0" ? "启用" : "禁用" }}
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/security_commitment_pro/administration/view',
query: { PROMISE_ID: row.PROMISE_ID },
})
"
>
查看
</el-button>
<el-button
type="primary"
text
link
@click="
fnEnableOrDisable(row.STATE === '0' ? 1 : 0, row.PROMISE_ID)
"
>
{{ row.STATE === "0" ? "禁用" : "启用" }}
</el-button>
<el-button
:disabled="row.ISSIGN !== 0"
type="primary"
text
link
@click="
router.push({
path: '/security_commitment_pro/administration/edit',
query: { PROMISE_ID: row.PROMISE_ID },
})
"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/security_commitment_pro/administration/details',
query: { PROMISE_ID: row.PROMISE_ID },
})
"
>
详情
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
type="primary"
@click="
router.push({
path: '/security_commitment_pro/administration/add',
})
"
>
新增
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import {
getAdministrationList,
setAdministrationEnableOrDisable,
} from "@/request/security_commitment_pro.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";
import { layoutFnGetCommitmentLevel } from "@/assets/js/data_dictionary.js";
import LayoutDepartment from "@/components/department/index.vue";
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getAdministrationList);
const fnGetDataTransfer = () => {
fnGetData({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const commitmentLevelList = await layoutFnGetCommitmentLevel();
const fnEnableOrDisable = debounce(
1000,
async (STATE, PROMISE_ID) => {
const message = STATE === 0 ? "启用" : "禁用";
await ElMessageBox.confirm(`确定要${message}当前承诺书吗?`, {
type: "warning",
});
await setAdministrationEnableOrDisable({ PROMISE_ID, STATE });
ElMessage.success(`${message}成功`);
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,136 @@
<template>
<layout-card>
<el-divider content-position="left">基本信息</el-divider>
<el-descriptions :column="2" border>
<el-descriptions-item label="承诺书名称">
{{ info.PROMISE_NAME }}
</el-descriptions-item>
<el-descriptions-item label="级别">
{{ info.LEVELNAME }}
</el-descriptions-item>
<el-descriptions-item label="适用期限开始">
{{ info.PROMISE_TERM_START }}
</el-descriptions-item>
<el-descriptions-item label="适用期限结束">
{{ info.PROMISE_TERM_END }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">承诺人</el-divider>
<el-descriptions :column="3" border>
<template v-for="(item, index) in info.people" :key="item.id">
<el-descriptions-item :label="'部门' + (index + 1)">
{{ item.DEPTNAME }}
</el-descriptions-item>
<el-descriptions-item :label="'岗位' + (index + 1)">
{{ item.POSTNAME }}
</el-descriptions-item>
<el-descriptions-item :label="'人员' + (index + 1)">
{{ item.USERNAME?.join("、") }}
</el-descriptions-item>
</template>
</el-descriptions>
<el-divider content-position="left">被承诺人</el-divider>
<el-descriptions :column="3" border>
<template v-for="(item, index) in info.coverpeople" :key="item.id">
<el-descriptions-item :label="'部门' + (index + 1)">
{{ item.DEPTNAME }}
</el-descriptions-item>
<el-descriptions-item :label="'岗位' + (index + 1)">
{{ item.POSTNAME }}
</el-descriptions-item>
<el-descriptions-item :label="'人员' + (index + 1)">
{{ item.USERNAME?.join("、") }}
</el-descriptions-item>
</template>
</el-descriptions>
<el-divider content-position="left">承诺内容</el-divider>
<el-descriptions :column="1" border>
<el-descriptions-item label="正文">
{{ info.TEXT }}
</el-descriptions-item>
<template v-for="(item, index) in info.DETAIL" :key="item.id">
<el-descriptions-item :label="'副文' + (index + 1)">
{{ item.value }}
</el-descriptions-item>
</template>
</el-descriptions>
<div class="tc mt-10">
<el-button type="primary" @click="fnView"> </el-button>
</div>
<view-info
v-model:visible="data.viewDialog.visible"
:info="data.viewDialog.info"
/>
</layout-card>
</template>
<script setup>
import { reactive, ref } from "vue";
import { getAdministrationView } from "@/request/security_commitment_pro.js";
import { useRoute } from "vue-router";
import ViewInfo from "../template/components/view.vue";
import { uniqBy } from "lodash-es";
const route = useRoute();
const { PROMISE_ID } = route.query;
const info = ref({});
const data = reactive({
viewDialog: {
visible: false,
info: {},
},
});
const fnGetData = async () => {
const resData = await getAdministrationView({ PROMISE_ID });
const DETAIL = resData.promistDetail.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
const people = resData.people;
const coverpeople = resData.coverpeople;
const newPeople = [];
const newCoverpeople = [];
for (let i = 0; i < people.length; i++) {
newPeople.push({
...people[i],
USERNAME: [],
id: people[i].PROMISEPEOPLE_ID,
});
for (let j = 0; j < newPeople.length; j++) {
if (people[i].POST_ID === newPeople[j].POST_ID) {
newPeople[j].USERNAME.push(people[i].USERNAME);
}
}
}
for (let i = 0; i < coverpeople.length; i++) {
newCoverpeople.push({
...coverpeople[i],
USERNAME: [],
id: coverpeople[i].PROMISEPEOPLE_ID,
});
for (let j = 0; j < newCoverpeople.length; j++) {
if (coverpeople[i].POST_ID === newCoverpeople[j].POST_ID) {
newCoverpeople[j].USERNAME.push(coverpeople[i].USERNAME);
}
}
}
info.value = {
...resData.varList,
DETAIL,
people: uniqBy(newPeople, "POST_ID"),
coverpeople: uniqBy(newCoverpeople, "POST_ID"),
};
};
fnGetData();
const fnView = () => {
data.viewDialog.info = {
...info.value,
FILEPATH: "",
SIGNTIME: "",
COVERPEOPLE: info.value.coverpeople[0].USERNAME[0],
};
data.viewDialog.visible = true;
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,151 @@
<template>
<layout-card>
<el-form ref="formRef" :rules="rules" :model="form" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="承诺书名称" prop="PROMISE_NAME">
<el-input v-model="form.PROMISE_NAME" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="类型" prop="LEVEL">
<el-select v-model="form.TYPE">
<el-option value="0" label="承诺书" />
<el-option value="1" label="责任状" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="级别" prop="LEVEL">
<el-select v-model="form.LEVEL">
<el-option
v-for="item in commitmentLevelList"
:key="item.DICTIONARIES_ID"
:value="item.BIANMA"
:label="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="正文" prop="TEXT">
<el-input v-model="form.TEXT" type="textarea" autosize />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="end">
<el-button type="primary" @click="fnAddDetail">
新增副文
</el-button>
</el-form-item>
</el-col>
<el-col v-for="(item, index) in form.DETAIL" :key="item.id" :span="24">
<el-form-item
:label="'副文' + (index + 1)"
:prop="'DETAIL.' + index + '.value'"
:rules="{
required: true,
message: '副文不能为空',
trigger: 'blur',
}"
>
<div
style="
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
"
>
<el-input
v-model="item.value"
type="textarea"
:autosize="{ minRows: 3 }"
/>
<el-button
class="ml-10"
v-if="index !== 0"
type="danger"
@click="form.DETAIL.splice(index, 1)"
>
删除
</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"> </el-button>
</div>
</layout-card>
</template>
<script setup>
import { ref } from "vue";
import { layoutFnGetCommitmentLevel } from "@/assets/js/data_dictionary.js";
import { debounce } from "throttle-debounce";
import { useRoute, useRouter } from "vue-router";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
setTemplateAdd,
setTemplateEdit,
getTemplateView,
} from "@/request/security_commitment_pro.js";
import { ElMessage } from "element-plus";
const route = useRoute();
const router = useRouter();
const { PROMISE_ID } = route.query;
const rules = ref({
PROMISE_NAME: [
{ required: true, message: "请输入承诺书名称", trigger: "blur" },
],
TYPE: [{ required: true, message: "请选择类型", trigger: "blur" }],
LEVEL: [{ required: true, message: "请选择级别", trigger: "blur" }],
TEXT: [{ required: true, message: "请输入正文", trigger: "blur" }],
});
const form = ref({
PROMISE_NAME: "",
TYPE: "",
LEVEL: "",
TEXT: "",
DETAIL: [],
});
const formRef = ref(null);
const fnAddDetail = () => {
form.value.DETAIL.push({ value: "", id: Math.random() });
};
const fnGetData = async () => {
if (!PROMISE_ID) {
fnAddDetail();
return;
}
const resData = await getTemplateView({ PROMISE_ID });
const DETAIL = resData.promistDetail.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
form.value = { ...resData.varList, DETAIL };
};
fnGetData();
const commitmentLevelList = await layoutFnGetCommitmentLevel();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const DETAIL = form.value.DETAIL.map((item, index) => ({
value: item.value,
index,
}));
PROMISE_ID
? await setTemplateEdit({ ...form.value, DETAIL: JSON.stringify(DETAIL) })
: await setTemplateAdd({ ...form.value, DETAIL: JSON.stringify(DETAIL) });
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,187 @@
<template>
<el-dialog v-model="visible" title="安全生产承诺书">
<div id="print" class="dialogContent">
<div class="cover print_use">
<h1>
{{ info.TYPE === "0" ? "安全生产承诺书" : "安全生产责任状" }}
</h1>
<div>
<div> </div>
<div>
{{
info.PROMISE_TERM_START &&
dayjs(info.PROMISE_TERM_START).format("YYYY年")
}}
</div>
</div>
</div>
<h1 class="title">
{{ info.TYPE === "0" ? "安全生产承诺书" : "安全生产责任状" }}
</h1>
<div v-if="info.TYPE === '0'">{{ info.COVERPEOPLE }}</div>
<div class="text">{{ info.TEXT }}</div>
<div class="collateral">
<div v-for="(item, index) in info.DETAIL" :key="index" class="item">
{{ item.value }}
</div>
</div>
<div class="text">
<div v-if="info.TYPE === '0'">
若违反上述承诺和未履行安全生产职责或发生责任事故的接受政府或公司事故调查组做出的处罚决定
</div>
<div v-if="info.TYPE === '0'">
承诺期限自{{
info.PROMISE_TERM_START &&
dayjs(info.PROMISE_TERM_START).format("YYYY年MM月DD日")
}}{{
info.PROMISE_TERM_END &&
dayjs(info.PROMISE_TERM_END).format("YYYY年MM月DD日")
}}
</div>
<div v-if="info.TYPE === '1'">
若未履行安全生产职责或发生生产安全事故的接受公司或政府事故调查组做出的处罚
</div>
<div v-if="info.TYPE === '1'">
责任期限自{{
info.PROMISE_TERM_START &&
dayjs(info.PROMISE_TERM_START).format("YYYY年MM月DD日")
}}{{
info.PROMISE_TERM_END &&
dayjs(info.PROMISE_TERM_END).format("YYYY年MM月DD日")
}}
</div>
</div>
<div
:style="{ alignItems: info.FILEPATH ? 'flex-end' : 'flex-start' }"
class="footer"
>
<div
v-if="info.TYPE === '0'"
:style="{ marginBottom: info.FILEPATH ? '50px' : '0px' }"
class="hairdresser"
>
承诺单位(盖章)
</div>
<div v-if="info.TYPE === '1'" class="hairdresser">
<div class="promiser">发状人{{ info.COVERPEOPLE }}</div>
<div class="time">
{{
info.CREATTIME && dayjs(info.CREATTIME).format("YYYY年MM月DD日")
}}
</div>
</div>
<div class="respondent">
<div class="promiser">
<span :style="{ marginRight: info.FILEPATH ? '0px' : '105px' }">
{{ info.TYPE === "0" ? "主要负责人签字" : "受状人" }}
</span>
<img
v-if="info.FILEPATH"
:src="VITE_FILE_URL + info.FILEPATH"
alt=""
/>
</div>
<div
:style="{ marginLeft: info.TYPE === '0' ? '125px' : '65px' }"
class="time"
>
{{ info.SIGNTIME && dayjs(info.SIGNTIME).format("YYYY年MM月DD日") }}
</div>
</div>
</div>
</div>
<template #footer>
<el-button @click="visible = false"> </el-button>
<el-button v-print="'#print'" type="primary"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import dayjs from "dayjs";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => ({}),
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
</script>
<style scoped lang="scss">
#print {
padding: 50px;
font-size: 16px;
.cover {
height: 841pt;
text-align: center;
position: relative;
h1 {
padding-top: 300px;
}
> div {
position: absolute;
bottom: 100px;
left: 50%;
transform: translateX(-50%);
}
}
.title {
text-align: center;
}
.text {
text-indent: 35px;
line-height: 26px;
letter-spacing: 2px;
text-align: justify;
}
.collateral {
text-indent: 35px;
line-height: 26px;
letter-spacing: 2px;
text-align: justify;
}
.footer {
text-indent: 35px;
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.respondent,
.hairdresser {
.promiser {
display: flex;
align-items: flex-end;
img {
margin-left: 30px;
width: 200px;
height: 100px;
}
}
.time {
margin-top: 30px;
margin-left: 65px;
}
}
}
</style>

View File

@ -0,0 +1,162 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="承诺书名称" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="PROMISE_NAME" label="承诺书名称" />
<el-table-column prop="LEVELNAME" label="级别" />
<el-table-column prop="CREATTIME" label="添加时间" />
<el-table-column label="状态">
<template v-slot="{ row }">
{{ row.ISDELETE === 0 ? "启用" : "禁用" }}
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template v-slot="{ row }">
<el-button type="primary" text link @click="fnView(row.PROMISE_ID)">
查看
</el-button>
<el-button
type="primary"
text
link
@click="
fnEnableOrDisable(row.ISDELETE === 0 ? 1 : 0, row.PROMISE_ID)
"
>
{{ row.ISDELETE === 0 ? "禁用" : "启用" }}
</el-button>
<el-button
type="primary"
text
link
@click="fnDelete(row.PROMISE_ID)"
>
删除
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/security_commitment_pro/template/edit',
query: { PROMISE_ID: row.PROMISE_ID },
})
"
>
编辑
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
type="primary"
@click="
router.push({ path: '/security_commitment_pro/template/add' })
"
>
新增
</el-button>
</template>
</layout-table>
</layout-card>
<view-info
v-model:visible="data.viewDialog.visible"
:info="data.viewDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import {
setTemplateDelete,
setTemplateEnableOrDisable,
getTemplateList,
getTemplateView,
} from "@/request/security_commitment_pro.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive } from "vue";
import ViewInfo from "./components/view.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getTemplateList);
const data = reactive({
viewDialog: {
visible: false,
info: {},
},
});
const fnView = async (PROMISE_ID) => {
const resData = await getTemplateView({ PROMISE_ID });
const DETAIL = resData.promistDetail.map((item) => ({
value: item.COLLATERAL,
id: item.PROMISEDETAIL_ID,
}));
data.viewDialog.info = { ...resData.varList, DETAIL, COVERPEOPLE: "XXX" };
data.viewDialog.visible = true;
};
const fnEnableOrDisable = debounce(
1000,
async (ISDELETE, PROMISE_ID) => {
const message = ISDELETE === 0 ? "启用" : "禁用";
await ElMessageBox.confirm(`确定要${message}当前承诺书吗?`, {
type: "warning",
});
await setTemplateEnableOrDisable({ PROMISE_ID, ISDELETE });
ElMessage.success(`${message}成功`);
fnResetPagination();
},
{ atBegin: true }
);
const fnDelete = debounce(
1000,
async (PROMISE_ID) => {
await ElMessageBox.confirm(`确定要删除当前承诺书吗?`, {
type: "warning",
});
await setTemplateDelete({ PROMISE_ID });
ElMessage.success(`删除成功`);
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -66,24 +66,15 @@
</el-form>
</el-card>
<layout-card>
<div class="mb-10 flex">
<div>备注红色日期代表周六日</div>
<div class="flex ml-10">
<img src="/src/assets/images/print/white/check.png" alt="" />
完成检查
</div>
<div class="flex ml-10">
<img src="/src/assets/images/print/white/error.png" alt="" />
未进行检查
</div>
<div class="flex ml-10">
<div class="mb-10">
<span>备注红色日期代表周六日</span>
<span class="ml-10"> 完成检查</span>
<span class="ml-10">× 未进行检查</span>
<span class="ml-10">
<img src="/src/assets/images/print/white/waring.png" alt="" />
离岗/休班/周期未结束
</div>
<div class="flex ml-10">
<img src="/src/assets/images/print/white/line.png" alt="" />
未建立
</div>
</span>
<span class="ml-10">- 未建立</span>
</div>
<layout-table
:data="list"
@ -154,15 +145,14 @@
.TYPE === '1'
"
style="position: relative"
class="flex"
>
<img src="/src/assets/images/print/white/check.png" alt="" />
<span
v-if="
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.CREATTIME === fnFormatDate(item)
"
style="position: absolute; right: -6px; top: -6px"
style="position: absolute; right: 0; top: -6px"
>
{{
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || "")
@ -178,20 +168,18 @@
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.TYPE === '2'
"
class="flex"
>
<img src="/src/assets/images/print/white/error.png" alt="" />
×
</span>
<span
v-else-if="
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.TYPE === '3'
"
class="flex"
>
<img src="/src/assets/images/print/white/line.png" alt="" />
-
</span>
<span v-else class="flex">
<span v-else>
<img src="/src/assets/images/print/white/waring.png" alt="" />
</span>
</template>
@ -253,11 +241,6 @@ const fnFormatDate = (day) => {
</script>
<style scoped lang="scss">
.flex {
display: flex;
align-items: center;
}
img {
width: 16px;
height: 16px;

View File

@ -3,60 +3,15 @@
<div id="printContent">
<!-- TODO 打印分页截断-->
<el-divider content-position="left">员工清单检查统计</el-divider>
<div class="mb-10 flex">
<div>备注</div>
<div class="flex ml-10">
<img
src="/src/assets/images/print/white/check.png"
alt=""
class="print_no_use"
/>
<img
src="/src/assets/images/print/black/check.png"
alt=""
class="print_use"
/>
完成检查
</div>
<div class="flex ml-10">
<img
src="/src/assets/images/print/white/error.png"
alt=""
class="print_no_use"
/>
<img
src="/src/assets/images/print/black/error.png"
alt=""
class="print_use"
/>
未进行检查
</div>
<div class="flex ml-10">
<img
src="/src/assets/images/print/white/waring.png"
alt=""
class="print_no_use"
/>
<img
src="/src/assets/images/print/black/waring.png"
alt=""
class="print_use"
/>
<div class="mb-10">
<span>备注</span>
<span class="ml-10"> 完成检查</span>
<span class="ml-10">× 未进行检查</span>
<span class="ml-10">
<img src="/src/assets/images/print/white/waring.png" alt="" />
离岗/休班/周期未结束
</div>
<div class="flex ml-10">
<img
src="/src/assets/images/print/white/line.png"
alt=""
class="print_no_use"
/>
<img
src="/src/assets/images/print/black/line.png"
alt=""
class="print_use"
/>
未建立
</div>
</span>
<span class="ml-10">- 未建立</span>
</div>
<div class="print_no_use">
<layout-table :data="list" :show-pagination="false">
@ -109,18 +64,14 @@
.TYPE === '1'
"
style="position: relative"
class="flex"
>
<img
src="/src/assets/images/print/white/check.png"
alt=""
/>
<span
v-if="
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.CREATTIME === fnFormatDate(item)
"
style="position: absolute; right: -6px; top: -6px"
style="position: absolute; right: 0; top: -6px"
>
{{
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || "")
@ -138,23 +89,18 @@
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.TYPE === '2'
"
class="flex"
>
<img
src="/src/assets/images/print/white/error.png"
alt=""
/>
×
</span>
<span
v-else-if="
(resMap[row.LISTMANAGER_ID][fnFormatDate(item)] || '')
.TYPE === '3'
"
class="flex"
>
<img src="/src/assets/images/print/white/line.png" alt="" />
-
</span>
<span v-else class="flex">
<span v-else>
<img
src="/src/assets/images/print/white/waring.png"
alt=""
@ -201,15 +147,14 @@
.TYPE === '1'
"
style="position: relative"
class="flex"
>
<img src="/src/assets/images/print/black/check.png" alt="" />
<span
v-if="
(resMap[item.LISTMANAGER_ID][fnFormatDate(item1)] || '')
.CREATTIME === fnFormatDate(item1)
"
style="position: absolute; right: -6px; top: -6px"
style="position: absolute; right: 0; top: -6px"
>
{{
(resMap[item.LISTMANAGER_ID][fnFormatDate(item1)] || "")
@ -222,20 +167,18 @@
(resMap[item.LISTMANAGER_ID][fnFormatDate(item1)] || '')
.TYPE === '2'
"
class="flex"
>
<img src="/src/assets/images/print/black/error.png" alt="" />
×
</span>
<span
v-else-if="
(resMap[item.LISTMANAGER_ID][fnFormatDate(item1)] || '')
.TYPE === '3'
"
class="flex"
>
<img src="/src/assets/images/print/black/line.png" alt="" />
-
</span>
<span v-else class="flex">
<span v-else>
<img src="/src/assets/images/print/black/waring.png" alt="" />
</span>
</template>
@ -277,11 +220,6 @@ const fnFormatDate = (day) => {
</script>
<style scoped lang="scss">
.flex {
display: flex;
align-items: center;
}
img {
width: 16px;
height: 16px;

View File

@ -0,0 +1,188 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="清单名称" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="人员" prop="USERNAME">
<el-input
v-model="searchForm.USERNAME"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPTIDS">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单类型">
<el-select v-model="searchForm.TYPE">
<el-option
v-for="item in inventoryTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="排查类型">
<el-select v-model="searchForm.RISKCHECKLISTTYPE">
<el-option
v-for="item in troubleshootingTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单级别">
<el-select v-model="searchForm.LISTINGLEVEL">
<el-option
v-for="item in [
{ BIANMA: '1', NAME: '公司' },
...inventoryLevelList,
]"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetDataTransfer"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="清单名称" />
<el-table-column prop="DEPARTMENT_NAME_ALL" label="部门" />
<el-table-column prop="POST_NAME" label="岗位" />
<el-table-column prop="USER_NAME" label="人员" width="100" />
<el-table-column prop="PERIODNAME" label="排查周期" width="100" />
<el-table-column prop="SCREENTYPENAME" label="排查类型" width="100" />
<el-table-column prop="TYPENAME" label="清单类型" width="100" />
<el-table-column
v-if="SPECIAL_ENTERPRISES.includes(CORPINFO_ID)"
prop="TASK_TYPE_NAME"
label="任务类型"
width="100"
/>
<el-table-column label="状态" width="100">
<template v-slot="{ row }">
<span v-if="row.ISDELETE === '0'"></span>
<span v-else-if="row.ISDELETE === '1'">禁用</span>
<span v-else-if="row.ISDELETE === '2'"> 已删除 </span>
<span v-else-if="row.ISDELETE === '-1'"> 彻底删除 </span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: `/troubleshooting_statistics/${type}_inspection/inspection_records`,
query: { LISTMANAGER_ID: row.LISTMANAGER_ID },
})
"
>
检查记录
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import {
layoutFnGetInventoryLevel,
layoutFnGetInventoryType,
layoutFnGetTroubleshootingType,
} from "@/assets/js/data_dictionary.js";
import { SPECIAL_ENTERPRISES } from "@/assets/js/constant.js";
import { useUserStore } from "@/pinia/user.js";
import { getChecklistInspectionRecordList } from "@/request/troubleshooting_statistics.js";
const props = defineProps({
type: {
type: String,
default: "day",
},
});
const router = useRouter();
const userStore = useUserStore();
const CORPINFO_ID = userStore.getUserInfo.CORPINFO_ID;
const PERIOD = {
day: "checkPeriod0001",
week: "checkPeriod0002",
ten_day: "checkPeriod0003",
};
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getChecklistInspectionRecordList, {
otherParams: { PERIOD: PERIOD[props.type] },
});
const fnGetDataTransfer = () => {
fnGetData({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const inventoryTypeList = await layoutFnGetInventoryType();
const troubleshootingTypeList = await layoutFnGetTroubleshootingType();
const inventoryLevelList = await layoutFnGetInventoryLevel();
</script>
<style scoped></style>

View File

@ -0,0 +1,192 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnGetData"
>
<el-row>
<el-col :span="6">
<el-form-item label="时间" prop="YEAR">
<el-date-picker
v-model="searchForm.YEAR"
:clearable="false"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="选择年"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnGetData">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<div id="printContainer">
<div class="tc">
<h2>{{ info.NAME }}</h2>
</div>
<div class="mb-20">
<div
class="ptb-15"
style="display: flex; justify-content: space-between"
>
<div>排查人员{{ info.USER_NAME }}</div>
<div>排查频次每天</div>
</div>
<table>
<thead>
<tr>
<th width="60" class="title">序号</th>
<th width="150" class="title">风险单元</th>
<th width="150" class="title">排查部位</th>
<th width="500" class="title">风险管控措施</th>
<th width="500" class="title">风险失控表现问题隐患</th>
<th width="150" class="title">失职部门和人员</th>
<th width="150" class="title">排查责任人</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in list" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.RISKUNITNAME }}</td>
<td>{{ item.PARTSNAME }}</td>
<td>{{ item.CHECK_CONTENT }}</td>
<td>{{ item.RISK_DESCR }}</td>
<td>{{ item.DEPARTMENT_NAME }}/{{ item.USERNAME }}</td>
<td>{{ info.DEPARTMENT_NAME }}/{{ info.USER_NAME }}</td>
</tr>
</tbody>
</table>
</div>
<div class="tc">
<h3>日常隐患排查表</h3>
</div>
<div class="mb-20">
<div class="tr ptb-15">
备注 表示已检查×表示未检查<img
src="/src/assets/images/print/white/waring.png"
alt=""
/>/ -
</div>
<table>
<tr v-for="(item, index) in recordList" :key="index">
<td
v-for="(item1, index1) in item.TRLIST"
:key="index1"
style="width: 100px; vertical-align: baseline"
>
<table>
<tbody>
<template
v-for="(item2, index2) in item1.TDLIST"
:key="index2"
>
<tr>
<td
v-for="(item3, index3) in item2.DAYLIST"
:key="index3"
>
{{ item3.DAY }}
</td>
</tr>
<tr>
<td
v-for="(item3, index3) in item2.DAYLIST"
:key="index3"
style="height: 38px"
>
<div v-if="item3.CHECKDATA === '△'">
<img
src="/src/assets/images/print/white/waring.png"
alt=""
/>
</div>
<div v-else>{{ item3.CHECKDATA }}</div>
</td>
</tr>
</template>
</tbody>
<tr>
<td colspan="7">
<div>{{ item1.MONTH }}月检查发现问题描述</div>
<div
v-for="(item4, index4) in item1.HDLIST"
:key="index4"
>
{{ item4 }}
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</div>
<div class="mt-10 tc">
<el-button type="primary" v-print="'#printContainer'"> </el-button>
</div>
<div v-html="PRINT_STYLE" />
</layout-card>
</div>
</template>
<script setup>
import { useRoute } from "vue-router";
import { getChecklistInspectionRecordDayInspectionList } from "@/request/troubleshooting_statistics.js";
import useListData from "@/assets/js/useListData.js";
import dayjs from "dayjs";
import { ref } from "vue";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const route = useRoute();
const { LISTMANAGER_ID } = route.query;
const info = ref({});
const recordList = ref([]);
const { list, searchForm, fnGetData } = useListData(
getChecklistInspectionRecordDayInspectionList,
{
otherParams: { LISTMANAGER_ID },
defaultSearchForm: { YEAR: dayjs().format("YYYY") },
usePagination: false,
callbackFn: (list, resData) => {
info.value = resData.pd;
recordList.value = resData.recordList;
},
}
);
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td,
th {
border: 1px solid var(--el-border-color);
padding: 8px 12px;
font-size: 14px;
text-align: center;
}
.title {
background: var(--el-fill-color-light);
}
}
img {
width: 16px;
height: 16px;
}
</style>

View File

@ -0,0 +1,9 @@
<template>
<index-view type="ten_day" />
</template>
<script setup>
import IndexView from "../day_inspection/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,175 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnGetData"
>
<el-row>
<el-col :span="6">
<el-form-item label="时间" prop="YEAR">
<el-date-picker
v-model="searchForm.YEAR"
:clearable="false"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="选择年"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnGetData">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<div id="printContainer">
<div class="tc">
<h2>{{ info.NAME }}</h2>
</div>
<div class="mb-20">
<div
class="ptb-15"
style="display: flex; justify-content: space-between"
>
<div>排查部门{{ info.DEPARTMENT_NAME }}</div>
</div>
<table>
<thead>
<tr>
<th width="60" class="title">序号</th>
<th width="150" class="title">风险单元</th>
<th width="150" class="title">排查部位</th>
<th width="500" class="title">风险管控措施</th>
<th width="500" class="title">风险失控表现问题隐患</th>
<th width="150" class="title">失职部门和人员</th>
<th width="150" class="title">排查责任人</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in list" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.RISKUNITNAME }}</td>
<td>{{ item.PARTSNAME }}</td>
<td>{{ item.CHECK_CONTENT }}</td>
<td>{{ item.RISK_DESCR }}</td>
<td>{{ item.DEPARTMENT_NAME }}/{{ item.USERNAME }}</td>
<td>{{ info.DEPARTMENT_NAME }}/{{ info.USER_NAME }}</td>
</tr>
</tbody>
</table>
</div>
<div class="tc">
<h3>{{ YEAR }}年旬检清单排查表</h3>
</div>
<div
class="ptb-15"
style="display: flex; justify-content: space-between"
>
<div>检查方式现场检查</div>
<div>检查人员{{ info.USER_NAME }}</div>
<div class="tr">
检查频次每旬至少一次备注 表示已检查×表示未检查<img
src="/src/assets/images/print/white/waring.png"
alt=""
/>/ -
</div>
</div>
<table>
<tr v-for="(item, index) in recordList" :key="index">
<td
v-for="(item1, index1) in item.TRLIST"
:key="index1"
:colspan="item1.COLSPAN"
:rowspan="item1.ROWSPAN"
style="width: 100px"
>
<div v-if="item1.VALUETYPE === 'string' && item1.VALUE === '△'">
<img
src="/src/assets/images/print/white/waring.png"
alt=""
width="16"
height="16"
/>
</div>
<div
v-else-if="item1.VALUETYPE === 'string' && item1.VALUE !== '△'"
>
{{ item1.VALUE }}
</div>
<div v-else-if="item1.VALUETYPE === 'array'">
<div v-for="(item2, index2) in item1.VALUE" :key="index2">
{{ index2 + 1 }}.{{ item2 }}
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="mt-10 tc">
<el-button type="primary" v-print="'#printContainer'"> </el-button>
</div>
<div v-html="PRINT_STYLE" />
</layout-card>
</div>
</template>
<script setup>
import { useRoute } from "vue-router";
import { getChecklistInspectionRecordTenDayInspectionList } from "@/request/troubleshooting_statistics.js";
import useListData from "@/assets/js/useListData.js";
import dayjs from "dayjs";
import { ref } from "vue";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const route = useRoute();
const { LISTMANAGER_ID } = route.query;
const info = ref({});
const recordList = ref([]);
const YEAR = ref("");
const { list, searchForm, fnGetData } = useListData(
getChecklistInspectionRecordTenDayInspectionList,
{
otherParams: { LISTMANAGER_ID },
defaultSearchForm: { YEAR: dayjs().format("YYYY") },
usePagination: false,
callbackFn: (list, resData) => {
info.value = resData.pd;
recordList.value = resData.recordList;
YEAR.value = searchForm.value.YEAR;
},
}
);
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td,
th {
border: 1px solid var(--el-border-color);
padding: 8px 12px;
font-size: 14px;
text-align: center;
}
.title {
background: var(--el-fill-color-light);
}
}
img {
width: 16px;
height: 16px;
}
</style>

View File

@ -0,0 +1,9 @@
<template>
<index-view type="week" />
</template>
<script setup>
import IndexView from "../day_inspection/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,170 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnGetData"
>
<el-row>
<el-col :span="6">
<el-form-item label="时间" prop="YEAR">
<el-date-picker
v-model="searchForm.YEAR"
:clearable="false"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="选择年"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnGetData">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<div id="printContainer">
<div class="tc">
<h2>{{ info.NAME }}</h2>
</div>
<div class="mb-20">
<div
class="ptb-15"
style="display: flex; justify-content: space-between"
>
<div>排查部门{{ info.DEPARTMENT_NAME }}</div>
</div>
<table>
<thead>
<tr>
<th width="60" class="title">序号</th>
<th width="150" class="title">风险单元</th>
<th width="150" class="title">排查部位</th>
<th width="500" class="title">风险管控措施</th>
<th width="500" class="title">风险失控表现问题隐患</th>
<th width="150" class="title">失职部门和人员</th>
<th width="150" class="title">排查责任人</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in list" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.RISKUNITNAME }}</td>
<td>{{ item.PARTSNAME }}</td>
<td>{{ item.CHECK_CONTENT }}</td>
<td>{{ item.RISK_DESCR }}</td>
<td>{{ item.DEPARTMENT_NAME }}/{{ item.USERNAME }}</td>
<td>{{ info.DEPARTMENT_NAME }}/{{ info.USER_NAME }}</td>
</tr>
</tbody>
</table>
</div>
<div class="tc">
<h3>{{ YEAR }}年周检清单排查表</h3>
</div>
<div
class="ptb-15"
style="display: flex; justify-content: space-between"
>
<div>检查方式现场检查</div>
<div>检查人员{{ info.USER_NAME }}</div>
<div class="tr">
检查频次每周一次备注 表示已检查×表示未检查<img
src="/src/assets/images/print/white/waring.png"
alt=""
/>/ -
</div>
</div>
<table>
<tr v-for="(item, index) in recordList" :key="index">
<td
v-for="(item1, index1) in item.TRLIST"
:key="index1"
:colspan="item1.COLSPAN"
:rowspan="item1.ROWSPAN"
style="width: 100px"
>
<div v-if="item1.VALUETYPE === 'string' && item1.VALUE === '△'">
<img src="/src/assets/images/print/white/waring.png" alt="" />
</div>
<div
v-else-if="item1.VALUETYPE === 'string' && item1.VALUE !== '△'"
>
{{ item1.VALUE }}
</div>
<div v-else-if="item1.VALUETYPE === 'array'">
<div v-for="(item3, index2) in item1.VALUE" :key="index2">
{{ index2 + 1 }}.{{ item3 }}
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="mt-10 tc">
<el-button type="primary" v-print="'#printContainer'"> </el-button>
</div>
<div v-html="PRINT_STYLE" />
</layout-card>
</div>
</template>
<script setup>
import { useRoute } from "vue-router";
import { getChecklistInspectionRecordWeekInspectionList } from "@/request/troubleshooting_statistics.js";
import useListData from "@/assets/js/useListData.js";
import dayjs from "dayjs";
import { ref } from "vue";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const route = useRoute();
const { LISTMANAGER_ID } = route.query;
const info = ref({});
const recordList = ref([]);
const YEAR = ref("");
const { list, searchForm, fnGetData } = useListData(
getChecklistInspectionRecordWeekInspectionList,
{
otherParams: { LISTMANAGER_ID },
defaultSearchForm: { YEAR: dayjs().format("YYYY") },
usePagination: false,
callbackFn: (list, resData) => {
info.value = resData.pd;
recordList.value = resData.recordList;
YEAR.value = searchForm.value.YEAR;
},
}
);
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td,
th {
border: 1px solid var(--el-border-color);
padding: 8px 12px;
font-size: 14px;
text-align: center;
}
.title {
background: var(--el-fill-color-light);
}
}
img {
width: 16px;
height: 16px;
}
</style>