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

# Conflicts:
#	src/views/enterprise_management/information/edit.vue
dev
zhangyanli 2024-05-13 08:58:36 +08:00
commit 98ea81ede4
270 changed files with 15006 additions and 2717 deletions
src
components
learning_train_type
qr_code
layout/header
views
archives_management/semester/components
continuous_improvement
enterprise_report
hazard_analysis
risk_analysis
risk_analysis_record
driving_inspections
driving_commitment
driving_type
education_user
review_user
sign_user
electronic_waybill_management
customer_management
location_managemen
emergency_resource_management

6
.env
View File

@ -1,7 +1,3 @@
VITE_BASE_URL=http://192.168.0.49:8093/
VITE_PROXY=/api/
VITE_PROXY=/api
VITE_FILE_URL=https://file.zcloudchina.com/YTHFile
VITE_TEMPLATE_URL=https://qaaq.qhdsafety.com/file/
VITE_ON_LINE_WEB_SOCKET_URL=wss://qaaq.qhdsafety.com/zxwebsocket/
VITE_LEARNING_WEB_SOCKET_URL=wss://qaaq.qhdsafety.com/websocket/

View File

@ -0,0 +1,3 @@
VITE_BASE_URL=http://192.168.0.69:7082/
VITE_ON_LINE_WEB_SOCKET_URL=ws://192.168.0.31:8869
VITE_LEARNING_WEB_SOCKET_URL=ws://192.168.0.31:8899

View File

@ -1,7 +1,10 @@
VITE_BASE_URL=http://192.168.0.31:7082/integrated_traffic/
VITE_PROXY=/api/
VITE_FILE_URL=https://file.zcloudchina.com/YTHFile
VITE_TEMPLATE_URL=https://qaaq.qhdsafety.com/file/
VITE_ON_LINE_WEB_SOCKET_URL=wss://qaaq.qhdsafety.com/zxwebsocket/
VITE_LEARNING_WEB_SOCKET_URL=wss://qaaq.qhdsafety.com/websocket/
VITE_BASE_URL=http://39.101.166.211:8073/integrated_traffic/
#websocket t掉线
VITE_ON_LINE_WEB_SOCKET_URL=ws://39.101.166.211:8869
# VITE_ON_LINE_WEB_SOCKET_URL=wss://qaaqjt.qhdsafety.com/disconnected/
#websocket 在线学习
VITE_LEARNING_WEB_SOCKET_URL=ws://39.101.166.211:8899
# VITE_LEARNING_WEB_SOCKET_URL=wss://qaaqjt.qhdsafety.com/onlinelearning/

View File

@ -2,4 +2,4 @@ public
dist
package.json
!.prettierrc.cjs
src/vite-env.d.ts
env.d.ts

27
env.d.ts vendored Normal file
View File

@ -0,0 +1,27 @@
interface ImportMetaEnv {
// Auto generate by env-parse
/**
* undefined
*/
readonly VITE_PROXY: string
/**
* undefined
*/
readonly VITE_FILE_URL: string
/**
* undefined
*/
readonly VITE_TEMPLATE_URL: string
/**
* undefined
*/
readonly VITE_BASE_URL: string
/**
* undefined
*/
readonly VITE_ON_LINE_WEB_SOCKET_URL: string
/**
* undefined
*/
readonly VITE_LEARNING_WEB_SOCKET_URL: string
}

View File

@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<title>交通运输安全生产综合管理系统</title>

10
package-lock.json generated
View File

@ -68,6 +68,7 @@
"unplugin-vue-components": "^0.22.12",
"vite": "^4.5.1",
"vite-plugin-enhance-log": "^0.5.2",
"vite-plugin-env-parse": "^1.0.10",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-remove-console": "^2.2.0",
"vue-eslint-parser": "^9.3.2"
@ -5966,6 +5967,15 @@
"vite": "^2.9.0 || ^3.0.0 || ^4.0.0"
}
},
"node_modules/vite-plugin-env-parse": {
"version": "1.0.10",
"resolved": "https://registry.npmmirror.com/vite-plugin-env-parse/-/vite-plugin-env-parse-1.0.10.tgz",
"integrity": "sha512-7C3ixNz02ExrYCZRkAhXRWXqWktR/YO/SkrCdOUFR3GCXALUGt4xNhTTVZonKH8SpA4xe1wp2mS606MKZdvOpw==",
"dev": true,
"peerDependencies": {
"vite": "*"
}
},
"node_modules/vite-plugin-eslint": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz",

View File

@ -70,6 +70,7 @@
"unplugin-vue-components": "^0.22.12",
"vite": "^4.5.1",
"vite-plugin-enhance-log": "^0.5.2",
"vite-plugin-env-parse": "^1.0.10",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-remove-console": "^2.2.0",
"vue-eslint-parser": "^9.3.2"

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -127,10 +127,9 @@ h1, h2, h3, h4, h5, h6 {
}
.layout-container {
background-color: #030f2f;
background-color: #051a55;
min-height: 100vh;
background-image: url("/src/assets/images/public/bg.jpg");
background-repeat: no-repeat;
}
a {

View File

@ -6,7 +6,7 @@
--el-text-color-regular: #fff !important;
--el-fill-color-light: #0e1d44 !important; //hover
--el-color-check: #14affe !important; //hover
--el-aside-bg-color: #081e42 !important;
--el-aside-bg-color: #08277e !important;
--el-input-bg-color: #081435 !important;
--el-fill-color-blank: #081435 !important; //
--el-border-color-lighter: var(--el-border-color) !important;
@ -91,7 +91,7 @@
.el-menu-item {
&:hover, &.is-active {
//background: #1d3f77;
background-image: linear-gradient(to right, #1e499a, rgba(0, 0, 0, 0));
background-image: linear-gradient(to right, #2c6ee9, rgba(0, 0, 0, 0));
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 455 KiB

View File

@ -16,7 +16,7 @@ export const MENU = [
{ title: "双重预防", model: MODEL["3"] },
{ title: "教育培训", model: MODEL["4"] },
{ title: "综合管理", model: MODEL["5"] },
{ title: "定位管理", model: MODEL["6"] },
// { title: "定位管理", model: MODEL["6"] },
];
// 安全生成及电子运单管理
export const PRACTITIONERMENU = [
@ -29,13 +29,6 @@ export const TRUCKMENU = [
{ id: "货B73752", name: "2" },
{ id: "货C87376", name: "3" },
];
export const PERSONTYPEMENU = [
{ id: "其他", name: "1" },
{ id: "驾驶员", name: "2" },
{ id: "监控员", name: "3" },
{ id: "押运员", name: "4" },
{ id: "安全负责人", name: "5" },
];
export const CUSTOMERTYPEMENU = [
{ id: "委托方", name: "1" },
{ id: "确认方", name: "2" },
@ -92,8 +85,8 @@ export const INSURANCEMENU = [
export const DUE_STATUS_LIST = [
// 到期状态
{ ID: "1", NAME: "未到期" },
{ ID: "0", NAME: "已到期" },
{ ID: "1", NAME: "未到期" },
{ ID: "2", NAME: "即将到期" },
];
@ -139,11 +132,18 @@ export const REMINDER_STATUS = [
{ ID: "1", NAME: "关闭" },
];
export const REMIND_DAYS = [
export const REMIND_DAYS = [
// 提醒天数
{ ID: "0", NAME: "30天", NUM: "30" },
{ ID: "1", NAME: "45天", NUM: "45" },
{ ID: "2", NAME: "90天", NUM: "90" }
{ ID: "2", NAME: "90天", NUM: "90" },
];
export const INSURANCE_TYPE = [
// 提醒天数
{ ID: "0", NAME: "承运人责任险" },
{ ID: "1", NAME: "强制险" },
{ ID: "2", NAME: "商业险" },
];
// export const MAINTENANCE_LEVEL_LIST = [

View File

@ -188,6 +188,20 @@ export const layoutFnGetRiskClassification = async () => {
});
return ref(resData.list);
};
// 风险等级
export const layoutFnGetRiskLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "a178357ce6ce4d6a9ac95def6aca3a14",
});
return ref(resData.list);
};
// 风险成因
export const layoutFnGetRiskCauses = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "1bacbc4c1f6544718519c0d470dfeb62",
});
return ref(resData.list);
};
// 排查项类型
export const layoutFnGetDrivingType = async () => {
const resData = await getLevels({
@ -195,6 +209,97 @@ export const layoutFnGetDrivingType = async () => {
});
return ref(resData.list);
};
// 适用领域
export const layoutFnGetApplicableFields = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "ab52643da4714042be2ebfb880097330",
});
return ref(resData.list);
};
// 预案类别
export const layoutFnGetPlanCategory = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "b2759070db524cc4ae2d60ee4b263dc3",
});
return ref(resData.list);
};
// 预案备案状态
export const layoutFnGetPlanFilingStatus = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "8d07af03be10473ca17e1516a8e860d2",
});
return ref(resData.list);
};
// 预案级别
export const layoutFnGetPlanLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "ab54d50f12ef4f578bc29c3b980b83e5",
});
return ref(resData.list);
};
// 装备类别
export const layoutFnGetEquipmentCategory = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "716f792cfc354fcf81bf3c0e904fb4f8",
});
return ref(resData.list);
};
// 救援专业
export const layoutFnGetRescueSpecialty = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "6a724d36c3ad416fad22049d932c329e",
});
return ref(resData.list);
};
// 队伍属性
export const layoutFnGetTeamAttribute = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "afde28dd39c841d984fb331116781ff3",
});
return ref(resData.list);
};
// 队伍类别
export const layoutFnGetTeamCategory = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "ef2f9a53723b4531968279fe4816be3d",
});
return ref(resData.list);
};
// 队伍等级
export const layoutFnGetTeamGrade = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "4dca6d39490d4845ba7b02df2ab68aa4",
});
return ref(resData.list);
};
// 队伍级别
export const layoutFnGetTeamLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "bfd057e59c124b42ac93e13c6a30b85e",
});
return ref(resData.list);
};
// 特种设备类型
export const layoutFnGetSpecialEquipmentType = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "cffb3d28d48548328ddd78976610b05d",
});
return ref(resData.list);
};
// 特种设备状态
export const layoutFnGetSpecialEquipmentState = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "0feb448f975e422fafbf5db20c0b85c9",
});
return ref(resData.list);
};
// 巡检周期
export const layoutFnGetInspectionCycle = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "3017f7f6f6794f23bf15d026a1e55426",
});
return ref(resData.list);
};
// 部门树
export const layoutFnGetDepartmentTree = async (params) => {
const resData = await getDepartmentTree(params);

View File

@ -40,17 +40,13 @@ export default function useListData(api, options = {}) {
getDataType(options.clearSelection) !== "Boolean"
)
throw new Error("options.clearSelection必须是一个布尔值");
if (options.otherParams && getDataType(options.otherParams) !== "Object")
throw new Error("options.otherParams必须是一个对象");
const immediate = options.immediate ?? true;
const usePagination = options.usePagination ?? true;
const key = options.key ?? "varList";
const defaultSearchForm = options.defaultSearchForm ?? {};
const clearSelection = options.clearSelection ?? true;
if (
immediate &&
options.otherParams &&
getDataType(options.otherParams) !== "Object"
)
throw new Error("options.otherParams必须是一个对象");
const list = ref([]);
const pagination = ref({
currentPage: 1,

View File

@ -414,8 +414,6 @@ export function subtractDaysFromDate(date, daysToSubtract, type = false) {
} else if (Object.prototype.toString.call(date) === "[object Date]") {
// 直接传入了 Date 对象
newDate = date;
} else {
console.log("无效的输入参数");
}
if (type) {
newDate.setDate(newDate.getDate() + daysToSubtract);

View File

@ -93,16 +93,16 @@ const getCurrentNode = () => {
if (props.type !== "industryType") {
if (data.value.length === 0) return {};
for (let i = 0; i < data.value.length; i++) {
if (data.value[i][keys[props.type]] === props.modelValue) {
if (data.value[i][keys[props.type]] === modelValue.value) {
return data.value[i];
}
}
}
return treeSelectRef.value.getCurrentNode();
};
const getNode = (value = getCurrentNode()) => {
const getNode = () => {
if (props.type !== "industryType") return "";
return treeSelectRef.value.getNode(getCurrentNode(value));
return treeSelectRef.value.getNode(getCurrentNode() || modelValue.value);
};
const getIndustryTypeCurrentCheckAll = () => {
const name = [];

View File

@ -1,6 +1,6 @@
<template>
<div class="tc mt-20 mb-20">
<img :src="src" alt="" width="200" height="200" />
<div :class="['tc', margin ? 'mt-20 mb-20' : '']">
<img :src="src" alt="" :width="width" :height="height" />
</div>
</template>
@ -16,10 +16,22 @@ const props = defineProps({
required: true,
default: "",
},
width: {
type: Number,
default: 200,
},
height: {
type: Number,
default: 200,
},
margin: {
type: Boolean,
default: true,
},
});
const src = useQRCode(() => props.src, {
width: 200,
height: 200,
width: props.width,
height: props.height,
margin: 1,
correctLevel: "H",
});

View File

@ -4,9 +4,9 @@
<div class="logo" />
<div class="menu">
<ul>
<li>
<!-- <li>
<div class="title">BI</div>
</li>
</li>-->
<template v-for="(item, index) in MENU" :key="index">
<li
:class="{ active: item.model === menuStore.getModel }"
@ -196,7 +196,7 @@ const fnSignOut = async () => {
padding: 0 20px;
margin-right: 20px;
border-radius: 2px;
font-size: 16px;
&.active {
background-image: url("/src/assets/images/public/tguang.png");
background-repeat: no-repeat;
@ -206,7 +206,7 @@ const fnSignOut = async () => {
.title {
padding-left: 3px;
font-size: 14px;
font-size: 16px;
}
}
}

View File

@ -70,7 +70,7 @@ export const getVehicleView = (params) =>
upload("/operatingvehicles/operationvehicleList", params); // 获取所有车船税
export const getAssignedOperationVehicleList = (params) =>
post("/assignedmanage/getassignedoperationvehiclelist", params); // 车型选择营运车辆列表
post("/assignedmanage/getAssignedVehicleList", params); // 车型选择营运车辆列表
export const getAssignedFreightTrailerList = (params) =>
post("/assignedmanage/getassignedfreighttrailerlist", params); // 车型选择货物挂车列表
post("/assignedmanage/getAssignedFreightTrailerList", params); // 车型选择货物挂车列表

View File

@ -0,0 +1,34 @@
import { post } from "@/request/axios.js";
export const setHazardAnalysisSubmit = (params) =>
post("/riskpointanalysis/add", params); // 隐患分析提交
export const getRiskAnalysisList = (params) =>
post("/riskpointanalysis/list", params); // 风险分析列表
export const setRiskAnalysisRepulse = (params) =>
post("/riskpointanalysis/delete", params); // 风险分析打回
export const setRiskAnalysisAdopt = (params) =>
post("/riskpointanalysis/apply", params); // 风险分析通过
export const getRiskAnalysisRecordList = (params) =>
post("/riskpoint/getLogs", params); // 风险分析记录列表
export const getRiskAnalysisRecordView = (params) =>
post("/riskpointanalysis/getInfo", params); // 风险分析记录查看
// 企业报告 start
export const getEnterpriseReport1 = (params) =>
post("/corpinfo/getDiagnosis", params);
export const getEnterpriseReport2 = (params) =>
post("/jobEvaluation/counlistPaget?showCount=1000&currentPage=1", params);
export const getEnterpriseReport3 = (params) =>
post("/studytask/list?showCount=100&currentPage=1", params);
export const getEnterpriseReport4 = (params) =>
post("/eightWork/getDiagnosis", params);
export const getEnterpriseReport5 = (params) =>
post("/performanceexamine_dept/listAll", params);
export const getEnterpriseReport6 = (params) =>
post("/performanceexamine_user/listAll", params);
export const getEnterpriseReportConclusion = (params) =>
post("/corpadvice/listAll", params); // 企业报告结论
export const setEnterpriseReportConclusionEdit = (params) =>
post("/corpadvice/edit", params); // 企业报告结论编辑
export const setEnterpriseReportConclusionAdd = (params) =>
post("/corpadvice/add", params); // 企业报告结论新增
// 企业报告 end

View File

@ -1,10 +1,22 @@
import { post, upload } from "@/request/axios.js";
export const getSecurityCustomerList = (params) =>
post("/securitycustomer/listForSecurityCustomerManagement", params); // 客户管理列表
post("/securitycustomer/listForSecurityCustomerManagement", params); // 客户管理列表table
export const addSafetyCustomerView = (params) =>
upload("/securitycustomer/add", params); // 添加
export const deleteSafetyCustomerView = (params) =>
upload("/securitycustomer/delete", params); // 删除
export const getTrafficCustomerSelectList = (params) =>
post("/securitycustomer/getTrafficCustomerSelectList", params); // 客户管理列表list
export const getTrafficCustomerSelectView = (params) =>
post("/securitycustomer/getTrafficCustomerSelectView", params); // 获取客户管理的数据回显
export const editSafetyCustomerInfo = (params) =>
upload("/securitycustomer/edit", params); // 添加
export const deleteContactInfo = (params) =>
upload("/securitycustomer/deleteContactInfo", params); // 删除

View File

@ -11,16 +11,16 @@ export const getLevels = (params) =>
});
// 获取数据字典
export const getLevelsByObject = (params) =>
post("/dictionaries/getDictList", {
loading: false,
...params,
});
post("/dictionaries/getDictList", {
loading: false,
...params,
});
// 获取数据字典
export const getLevelCustom = (params) =>
post("/dictionaries/getLevelCustom", {
loading: false,
...params,
});
post("/dictionaries/getLevelCustom", {
loading: false,
...params,
});
// 获取数据字典
export const getLevelsCorp = (params) =>
post("/dictionariesCorp/getLevels", {

View File

@ -0,0 +1,152 @@
import { post, upload } from "@/request/axios";
export const getEmergencyPlanManagementList = (params) =>
post("/emergencyplan/list", params); // 应急预案管理列表
export const getEmergencyPlanManagementView = (params) =>
post("/emergencyplan/goEdit", params); // 应急预案管理查看
export const setEmergencyPlanManagementDelete = (params) =>
post("/emergencyplan/delete", params); // 应急预案管理删除
export const setEmergencyPlanManagementDeleteMultiple = (params) =>
post("/emergencyplan/deleteAll", params); // 应急预案管理删除多选
export const setEmergencyPlanManagementEdit = (params) =>
upload("/emergencyplan/edit", params); // 应急预案管理修改
export const setEmergencyPlanManagementAdd = (params) =>
upload("/emergencyplan/add", params); // 应急预案管理添加
export const getEmergencyEquipmentManagementList = (params) =>
upload("/emergencyequipment/list", params); // 应急装备管理列表
export const getEmergencyEquipmentManagementView = (params) =>
post("/emergencyequipment/goEdit", params); // 应急装备管理查看
export const setEmergencyEquipmentManagementDelete = (params) =>
post("/emergencyequipment/delete", params); // 应急装备管理删除
export const setEmergencyEquipmentManagementDeleteMultiple = (params) =>
post("/emergencyequipment/deleteAll", params); // 应急装备管理删除多选
export const setEmergencyEquipmentManagementEdit = (params) =>
post("/emergencyequipment/edit", params); // 应急装备管理修改
export const setEmergencyEquipmentManagementAdd = (params) =>
post("/emergencyequipment/add", params); // 应急装备管理添加
export const getEmergencyRescueTeamManagementList = (params) =>
upload("/emergencyteam/list", params); // 应急救援队伍管理列表
export const getEmergencyRescueTeamManagementView = (params) =>
post("/emergencyteam/goEdit", params); // 应急救援队伍管理查看
export const setEmergencyRescueTeamManagementDelete = (params) =>
post("/emergencyteam/delete", params); // 应急救援队伍管理删除
export const setEmergencyRescueTeamManagementDeleteMultiple = (params) =>
post("/emergencyteam/deleteAll", params); // 应急救援队伍管理删除多选
export const setEmergencyRescueTeamManagementEdit = (params) =>
post("/emergencyteam/edit", params); // 应急救援队伍管理修改
export const setEmergencyRescueTeamManagementAdd = (params) =>
post("/emergencyteam/add", params); // 应急救援队伍管理添加
export const getEmergencyNewTeamManagementList = (params) =>
upload("/emergencynewteam/list", params); // 应急队伍管理列表
export const getEmergencyNewTeamManagementView = (params) =>
post("/emergencynewteam/goEdit", params); // 应急队伍管理查看
export const setEmergencyNewTeamManagementDelete = (params) =>
post("/emergencynewteam/delete", params); // 应急队伍管理删除
export const setEmergencyNewTeamManagementDeleteMultiple = (params) =>
post("/emergencynewteam/deleteAll", params); // 应急队伍管理删除多选
export const setEmergencyNewTeamManagementAdd = (params) =>
post("/emergencynewteam/add", params); // 应急队伍管理添加
export const setEmergencyNewTeamManagementGet = (params) =>
post("/emergencynewteam/getById", params); // 应急队伍管理查询总指挥队伍
export const setEmergencyNewTeamManagementGetE = (params) =>
post("/emergencynewteam/getEById", params); // 应急队伍管理查询领导
export const setEmergencyNewTeamManagementGetS = (params) =>
post("/emergencynewteam/getSById", params); // 应急队伍管理查询组员
export const setEmergencyNewTeamManagementAddE = (params) =>
post("/emergencynewteam/addE", params); // 应急队伍管理新增领导
export const setEmergencyNewTeamManagementAddS = (params) =>
post("/emergencynewteam/addS", params); // 应急队伍管理新增组员
export const setEmergencyNewTeamManagementDeleteItem = (params) =>
post("/emergencynewteam/deleteItem", params); // 应急队伍管理删除
export const setEmergencyNewTeamManagementDeleteItemMultiple = (params) =>
post("/emergencynewteam/deleteItemAll", params); // 应急队伍管理删除多选
export const setEmergencyTeamManagementEditS = (params) =>
post("/emergencynewteam/editS", params); // 应急救援队伍管理修改
export const setEmergencyTeamManagementEditE = (params) =>
post("/emergencynewteam/editE", params); // 应急救援队伍管理修改
export const setEmergencyTeamManagementEdit = (params) =>
post("/emergencynewteam/edit", params); // 应急救援队伍管理修改
export const getEmergencyDrillManagementList = (params) =>
upload("/emergencydrillbasic/list", params); // 应急演练管理列表
export const setEmergencyDrillManagementDelete = (params) =>
post("/emergencydrillbasic/delete", params); // 应急演练管理删除
export const setEmergencyDrillManagementDeleteMultiple = (params) =>
post("/emergencydrillbasic/deleteAll", params); // 应急演练管理删除多选
export const getEmergencyDrillManagementViewInfo = (params) =>
post("/emergencydrillbasic/goEdit", params); // 应急演练管理查看基本信息
export const getEmergencyDrillManagementViewCommandingOrganization = (params) =>
post("/emergencydrillorg/listByBaseId", params); // 应急演练管理查看应急指挥机构
export const getEmergencyDrillManagementViewCommandingOrganizationPersonnel = (
params
) => post("/emergencydrillorgmember/listByBaseId", params); // 应急演练管理查看应急指挥机构人员
export const getEmergencyDrillManagementViewDrillContent = (params) =>
post("/emergencydrillcontent/listByBaseId", params); // 应急演练管理查看演练内容
export const getEmergencyDrillManagementViewDrillScene = (params) =>
post("/emergencydrillscene/listByBaseId", params); // 应急演练管理查看演练场景
export const getEmergencyDrillManagementViewSummaryEvaluation = (params) =>
post("/emergencydrillreport/goEditByBasicId", params); // 应急演练管理查看总结评估
export const getEmergencyDrillManagementViewSchemeText = (params) =>
post("/emergencydrillattachment/goEditByBasicId", params); // 应急演练管理查看应急演练方案文本
export const setEmergencyDrillManagementInfoAdd = (params) =>
post("/emergencydrillbasic/add", params); // 应急演练管理基本信息添加
export const setEmergencyDrillManagementInfoEdit = (params) =>
post("/emergencydrillbasic/edit", params); // 应急演练管理基本信息修改
export const getEmergencyDrillManagementMechanismList = (params) =>
post("/emergencydrillorg/list", params); // 应急演练管理应急指挥机构列表
export const getEmergencyDrillManagementMechanismView = (params) =>
post("/emergencydrillorg/goEdit", params); // 应急演练管理应急指挥机构查看
export const setEmergencyDrillManagementMechanismDelete = (params) =>
post("/emergencydrillorg/delete", params); // 应急演练管理应急指挥机构删除
export const setEmergencyDrillManagementMechanismDeleteMultiple = (params) =>
post("/emergencydrillorg/deleteAll", params); // 应急演练管理应急指挥机构删除多选
export const setEmergencyDrillManagementMechanismAdd = (params) =>
post("/emergencydrillorg/add", params); // 应急演练管理应急指挥机构添加
export const setEmergencyDrillManagementMechanismEdit = (params) =>
post("/emergencydrillorg/edit", params); // 应急演练管理应急指挥机构修改
export const getEmergencyDrillManagementPersonnelList = (params) =>
post("/emergencydrillorgmember/list", params); // 应急演练管理应急指挥机构人员列表
export const getEmergencyDrillManagementPersonnelView = (params) =>
post("/emergencydrillorgmember/goEdit", params); // 应急演练管理应急指挥机构人员查看
export const setEmergencyDrillManagementPersonnelDelete = (params) =>
post("/emergencydrillorgmember/delete", params); // 应急演练管理应急指挥机构人员删除
export const setEmergencyDrillManagementPersonnelDeleteMultiple = (params) =>
post("/emergencydrillorgmember/deleteAll", params); // 应急演练管理应急指挥机构人员删除多选
export const setEmergencyDrillManagementPersonnelAdd = (params) =>
post("/emergencydrillorgmember/add", params); // 应急演练管理应急指挥机构人员添加
export const setEmergencyDrillManagementPersonnelEdit = (params) =>
post("/emergencydrillorgmember/edit", params); // 应急演练管理应急指挥机构人员修改
export const getEmergencyDrillManagementContentList = (params) =>
post("/emergencydrillcontent/list", params); // 应急演练管理演练内容列表
export const getEmergencyDrillManagementContentView = (params) =>
post("/emergencydrillcontent/goEdit", params); // 应急演练管理演练内容查看
export const setEmergencyDrillManagementContentDelete = (params) =>
post("/emergencydrillcontent/delete", params); // 应急演练管理演练内容删除
export const setEmergencyDrillManagementContentDeleteMultiple = (params) =>
post("/emergencydrillcontent/deleteAll", params); // 应急演练管理演练内容删除多选
export const setEmergencyDrillManagementContentAdd = (params) =>
post("/emergencydrillcontent/add", params); // 应急演练管理演练内容添加
export const setEmergencyDrillManagementContentEdit = (params) =>
post("/emergencydrillcontent/edit", params); // 应急演练管理演练内容修改
export const getEmergencyDrillManagementSceneList = (params) =>
post("/emergencydrillscene/list", params); // 应急演练管理演练场景列表
export const getEmergencyDrillManagementSceneView = (params) =>
post("/emergencydrillscene/goEdit", params); // 应急演练管理演练场景查看
export const setEmergencyDrillManagementSceneDelete = (params) =>
post("/emergencydrillscene/delete", params); // 应急演练管理演练场景删除
export const setEmergencyDrillManagementSceneDeleteMultiple = (params) =>
post("/emergencydrillscene/deleteAll", params); // 应急演练管理演练场景删除多选
export const setEmergencyDrillManagementSceneAdd = (params) =>
post("/emergencydrillscene/add", params); // 应急演练管理演练场景添加
export const setEmergencyDrillManagementSceneEdit = (params) =>
post("/emergencydrillscene/edit", params); // 应急演练管理演练场景修改
export const setEmergencyDrillManagementViewSummaryEvaluationAdd = (params) =>
upload("/emergencydrillreport/add", params); // 应急演练管理总结评估添加
export const setEmergencyDrillManagementViewSummaryEvaluationEdit = (params) =>
upload("/emergencydrillreport/edit", params); // 应急演练管理总结评估修改
export const setEmergencyDrillManagementViewSchemeTextAdd = (params) =>
upload("/emergencydrillattachment/add", params); // 应急演练管理应急演练方案文本添加
export const setEmergencyDrillManagementViewSchemeTextEdit = (params) =>
upload("/emergencydrillattachment/edit", params); // 应急演练管理应急演练方案文本修改

View File

@ -30,7 +30,7 @@ export const setUserResetPassword = (params) =>
post("/corpinfo/resetPwd", params); // 用户管理重置密码
export const getUserScheduling = (params) =>
post("/shiftworkrules/listAll", params); // 用户管理获取排班
export const setUserImport = (params) => upload("/user/readExcel2", params); // 用户管理导入
export const setUserImport = (params) => upload("/user/readExcel4", params); // 用户管理导入
export const setUserLearnersImport = (params) =>
upload("/user/readExcel3", params); // 用户管理在线学习人员导入
export const getUserInfo = (params) => post("/user/goAddUser", params); // 用户管理添加获取信息

View File

@ -8,3 +8,12 @@ export const addSafetyLocationView = (params) =>
export const deleteSafetyLocationView = (params) =>
post("/securitylocation/delete", params); // 添加地段管理
export const getTrafficLocationSelectList = (params) =>
post("/securitylocation/getTrafficLocationSelectList", params); // 地点管理列表
export const getSecurityLocationView = (params) =>
post("/securitylocation/goEdit", params); // 根据Id获取地点管理信息
export const editSafetyLocationInfo = (params) =>
post("/securitylocation/edit", params); // 添加地段管理

View File

@ -1,23 +0,0 @@
import { post } from "./axios";
export const getRealTimeList = (params) => post("/map/getRealTimeList", params); // 获取在线人员列表
export const getFenceList = (params) => post("/map/getFenceList", params); // 获取围栏列表
export const getPersonnelTrajectories = (params) =>
post("/map/getPersonnelTrajectories", params); // 获取拥有历史轨迹的全部角色
export const getCharacterTrajectories = (params) =>
post("/map/getCharacterTrajectories", params); // 获取轨迹
export const getUserByCardNo = (params) =>
post("/user/getUserByCardNo", params);
export const getEightWorks = (params) => post("/map/getEightWorks", params);
export const getHotworkList = (params) => post("/map/getHotworkList", params);
export const getEightWorksByType = (params) =>
post("/map/getEightWorksByType", params);
export const getCameraList = (params) => post("/map/getCameraList", params);
export const getConfinedspaceWorkList = (params) =>
post("/map/getConfinedspaceWorkList", params);
export const getHighWorkList = (params) => post("/map/getHighWorkList", params);

View File

@ -26,7 +26,8 @@ export const getOperationsList = (params) => post("/operations/list", params); /
export const getOperationsView = (params) => post("/operations/goEdit", params); // 运营管理查看
export const setOperationsAdd = (params) => post("/operations/add", params); // 运营管理新增
export const setOperationsEdit = (params) => post("/operations/edit", params); // 运营管理修改
export const getOperationTrailerList = (params) => post("/operations/vehicleList", params);
export const getOperationTrailerList = (params) =>
post("/operations/vehicleList", params);
export const setOperationsDelete = (params) =>
post("/operations/delete", params); // 运营管理删除
export const setOperationsEdit2 = (params) => post("/operations/edit2", params); // 运营管理修改开启关闭
@ -41,7 +42,8 @@ export const setMaintenanceDelete = (params) =>
export const setMaintenanceEdit2 = (params) =>
post("/maintenance/edit2", params); // 维保管理修改开启关闭
export const getTrailerListMaintenance = (params) => post("/maintenance/vehicleList", params);
export const getTrailerListMaintenance = (params) =>
post("/maintenance/vehicleList", params);
export const getBeidouList = (params) => post("/beidou/list", params); // 维保管理列表
export const getBeidouView = (params) => post("/beidou/goEdit", params); // 维保管理查看
@ -50,4 +52,5 @@ export const setBeidouEdit = (params) => post("/beidou/edit", params); // 维保
export const setBeidouDelete = (params) => post("/beidou/delete", params); // 维保管理删除
export const setBeidouEdit2 = (params) => post("/beidou/edit2", params); // 维保管理修改开启关闭
export const getTrailerListCompass = (params) => post("/beidou/vehicleList", params);
export const getTrailerListCompass = (params) =>
post("/beidou/vehicleList", params);

View File

@ -0,0 +1,14 @@
import { post } from "@/request/axios.js";
export const getLeaveList = (params) => post("/offduty/list", params); // 离岗管理列表
export const getLeaveView = (params) => post("/offduty/goEdit", params); // 离岗管理查看
export const setLeaveEdit = (params) => post("/offduty/edit", params); // 离岗管理修改
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

@ -2,7 +2,7 @@ import { post, upload } from "@/request/axios.js";
export const getVehicleColor = (params) =>
post("/dictionaries/getVehicleColor", {
// 获取车颜色
// 获取车颜色
loading: false,
...params,
});
@ -108,8 +108,6 @@ export const findByPlateNumber = (params) =>
const getCorpList = (params) => post("/operatingvehicles/corpList", params);
export const getOperationVehicleCorpList1 = async () => {
const resData = await getCorpList();
return resData.list;

View File

@ -1,5 +1,6 @@
import { post, upload } from "@/request/axios.js";
import {
getLevels,
getLevelsByObject,
getLevelsByParentId,
} from "@/request/data_dictionary.js";
@ -17,18 +18,34 @@ export const getSecurityNoticeInfo = (params) =>
post("/securitynotice/goEdit", params); // 安全通知详情
export const addSecurityNotice = (params) =>
upload("/securitynotice/add", params); // 添加安全通知
export const getUserListAll = (params) => post("/user/listSelect", params);
export const editSecurityNotice = (params) =>
upload("/securitynotice/edit", params); // 修改安全通知
export const getUserBuUserId = (params) =>
post("/user/getUserByUserId", params);
export const issueSecurityNotice = (params) =>
post("/securitynotice/issueSecurityNotice", params); // 发布安全通知
// 通知等级
export const layoutFnGetNotificationsClassification = async () => {
const resData = await getLevelsByParentId({
parentId: "aaecb47d95524b84904809671e48a777",
DICTIONARIES_ID: "aaaecb47d95524b84904809671e48a656",
});
return ref(resData);
};
export const layoutFnGetMicrosoftSecurityEstate = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "aaaecb47d95524b84904809671e48a656",
});
return ref(resData);
};
// 获取交通处罚从业人员列表
export const getTrafficPenaltyUserList = (params) =>
post("/user/getTrafficPenaltyUserList", params);
// 从业类型(人员类型)
export const layoutFnGetSIGNEDSTATUSClassification = async () => {
const resData = await getLevelsByObject({

View File

@ -1,10 +1,10 @@
import { ref } from "vue";
import { getLevelsByParentId } from "@/request/data_dictionary.js";
import { getLevels } from "@/request/data_dictionary.js";
import { post, upload } from "@/request/axios.js";
export const layoutFnGetScrapType = async () => {
const resData = await getLevelsByParentId({
parentId: "78452f4ec77e4d98ae8cdd9c3386ae0c",
const resData = await getLevels({
DICTIONARIES_ID: "78452f4ec77e4d98ae8cdd9c3386ae0c",
});
return ref(resData);
};
@ -26,7 +26,7 @@ export const getOperationVehicleList = (params) =>
upload("/operatingvehicles/operationvehicleList", params); // 获取所有车船税
export const getScrapOperationVehicleList = (params) =>
post("/scrapmanage/getscrapoperationvehiclelist", params); // 车型选择营运车辆列表
post("/scrapmanage/getScrapOperationVehicleList", params); // 车型选择营运车辆列表
export const getScrapFreightTrailerList = (params) =>
post("/scrapmanage/getscrapfreighttrailerlist", params); // 车型选择货物挂车列表
post("/scrapmanage/getScrapFreightTrailerList", params); // 车型选择货物挂车列表

View File

@ -0,0 +1,21 @@
import { post } from "@/request/axios.js";
export const getPlanList = (params) =>
post("/safetyinvestmentplan/list", params); // 安全投入计划列表
export const getPlanView = (params) =>
post("/safetyinvestmentplan/goEdit", params); // 安全投入计划查看
export const setPlanDelete = (params) =>
post("/safetyinvestmentplan/delete", params); // 安全投入计划删除
export const setPlanBatchDelete = (params) =>
post("/safetyinvestmentplan/deleteAll", params); // 安全投入计划批量删除
export const setPlanAdd = (params) => post("/safetyinvestmentplan/add", params); // 安全投入计划新增
export const setPlanEdit = (params) =>
post("/safetyinvestmentplan/edit", params); // 安全投入计划编辑
export const setPlanReview = (params) =>
post("/safetyinvestmentplan/editStatus", params); // 安全投入计划审核
export const getExtractionAndUseList = (params) =>
post("/safetyinvestmentuse/listAll", params); // 安全生产费用提取和使用管理列表
export const setExtractionAndUseBatchDelete = (params) =>
post("/safetyinvestmentuse/deleteAll", params); // 安全生产费用提取和使用管理批量删除
export const setExtractionAndUseAdd = (params) =>
post("/safetyinvestmentuse/add", params); // 安全生产费用提取和使用管理新增

View File

@ -6,7 +6,9 @@ export const setDrivingCommitmentDelete = (params) =>
post("/drivingcommitment/delete", params); // 行车日志删除
export const getSafetyDrivingCommitmentView = (params) =>
post("/drivingcommitment/goEdit", params); // 安全例会详情
post("/drivingcommitment/goEdit", params); // 行车承诺详情
export const setDrivingCommitmentAdd = (params) => post("/drivingcommitment/add", params); // 风险点单元添加
export const setDrivingCommitmentEdit = (params) => post("/drivingcommitment/edit", params); // 风险点单元修改
export const setDrivingCommitmentAdd = (params) =>
post("/drivingcommitment/add", params); // 行车承诺添加
export const setDrivingCommitmentEdit = (params) =>
post("/drivingcommitment/edit", params); // 行车承诺修改

View File

@ -6,7 +6,7 @@ export const setDrivingTypeDelete = (params) =>
post("/drivingtype/delete", params); // 行车日志删除
export const getSafetyDrivingTypeView = (params) =>
post("/drivingtype/goEdit", params); // 安全例会详情
post("/drivingtype/goEdit", params); // 行车排查项类型详情
export const setDrivingTypeAdd = (params) => post("/drivingtype/add", params); // 风险点单元添加
export const setDrivingTypeEdit = (params) => post("/drivingtype/edit", params); // 风险点单元修改
export const setDrivingTypeAdd = (params) => post("/drivingtype/add", params); // 行车排查项类型添加
export const setDrivingTypeEdit = (params) => post("/drivingtype/edit", params); // 行车排查项类型修改

View File

@ -14,3 +14,6 @@ export const infoOccupationalHazardsView = (params) =>
export const deleteOccupationalHazardsView = (params) =>
post("/occupationalhazards/delete", params); // 删除 岗位安全责任书
export const getSafetyOccupationalHazardsEdit = (params) =>
upload("/occupationalhazards/getSafetyOccupationalHazardsEdit", params); // 详情 职业危害告知书

View File

@ -15,3 +15,6 @@ export const infoCommitmentView = (params) =>
export const deleteCommitmentView = (params) =>
post("/commitment/delete", params); // 删除 承诺书
export const getSafetyCommitmentEdit = (params) =>
post("/commitment/safetyCommitment", params); // 承诺书列表

View File

@ -11,3 +11,6 @@ export const infoProductionView = (params) =>
export const deleteProductionView = (params) =>
upload("/production/delete", params); // 删除 安全生产目标
export const getSafetyProductionEdit = (params) =>
upload("/production/getSafetyProductionEdit", params); // 详情 安全生产目标

View File

@ -14,3 +14,6 @@ export const infoResponsibilityView = (params) =>
export const deleteResponsibilityView = (params) =>
post("/responsibility/delete", params); // 删除 岗位安全责任书
export const getSafetyResponsibilityEdit = (params) =>
upload("/responsibility/getSafetyResponsibilityEdit", params); // 详情 岗位安全责任书

View File

@ -0,0 +1,17 @@
import { post } from "@/request/axios.js";
export const getChecklistInspectionRecordList = (params) =>
post("/listmanager/recordListAll", params); // 清单检查记录列表
export const getChecklistInspectionRecordDayInspectionList = (params) =>
post("/listmanager/statisticsListCheckDay", params); // 清单检查记录日检列表-风险管控清单
export const getCustomChecklistInspectionRecordDayInspectionList = (params) =>
post("/hiddenstandardCustom/statisticsListCheckDay", params); // 清单检查记录日检列表-隐患排查清单
export const getChecklistInspectionRecordWeekInspectionList = (params) =>
post("/listmanager/statisticsListCheckWeek", params); // 清单检查记录周检列表-风险管控清单
export const getCustomChecklistInspectionRecordWeekInspectionList = (params) =>
post("/hiddenstandardCustom/statisticsListCheckWeek", params); // 清单检查记录周检列表-隐患排查清单
export const getChecklistInspectionRecordTenDayInspectionList = (params) =>
post("/listmanager/statisticsListCheckTenday", params); // 清单检查记录旬检列表-风险管控清单
export const getCustomChecklistInspectionRecordTenDayInspectionList = (
params
) => post("/hiddenstandardCustom/statisticsListCheckTenday", params); // 清单检查记录旬检列表-风险管控清单

View File

@ -12,7 +12,8 @@ export const setPractitionerReview = (params) =>
export const getPractitionerInfo = (params) =>
post("/user/getPractitionerInfo", params);
export const getPractitionerForEdit = (params) => post("/user/getPractitionerForEdit", params); // 用户管理查看
export const getPractitionerForEdit = (params) =>
post("/user/getPractitionerForEdit", params); // 用户管理查看
// 从业人员添加(需从业人员确认)
export const setPractitionerAdd = (params) =>
@ -25,3 +26,11 @@ export const setPractitionerEdit = (params) =>
// 从业人员解聘
export const setPractitionerDismissal = (params) =>
post("/user/setPractitionerDismissal", params);
// 人员列表(table分页)
export const getUserSelectListAll = (params) =>
post("/user/listSelect", params);
// 人员列表(select)
export const getPractitionerSelectList = (params) =>
post("/user/getPractitionerSelectList", params);

View File

@ -3,9 +3,6 @@ import { post, upload } from "@/request/axios.js";
export const getSecurityWaybillreList = (params) =>
post("/waybillregistration/listForSecurityWaybillre", params); // 运单登记列表
export const getSecurityPerson = (params) =>
post("/waybillregistration/forSecurityPerson", params);
export const addSafetyWaybillreView = (params) =>
upload("/waybillregistration/add", params); // 添加运单登记
@ -17,3 +14,11 @@ export const getUserPersonTypeListAll = (params) =>
export const dateteSecurityAllWaybillre = (params) =>
post("/waybillregistration/deleteAll", params); // 批量删除
export const getSafetyWaybillreInfo = (params) =>
post("/waybillregistration/goEdit", params); // 获取运单信息
export const getPrincipalContactList = (params) =>
post("/waybillregistration/getPrincipalContactList", params); // 委托方的联系人列表
export const editSafetyWaybillreInfo = (params) =>
upload("/waybillregistration/edit", params); // 修改运单信息

View File

@ -0,0 +1,16 @@
import { post } from "@/request/axios.js";
export const getWorkforceManagementList = (params) =>
post("/shiftworkrules/list", params); // 排班管理列表
export const setWorkforceManagementDeleteOne = (params) =>
post("/shiftworkrules/deleteOne", params); // 排班管理一级列表删除
export const setWorkforceManagementDeleteTwo = (params) =>
post("/shiftworkrules/deleteTwo", params); // 排班管理二级列表删除
export const setWorkforceManagementAdd = (params) =>
post("/shiftworkrules/add", params); // 排班管理添加
export const setWorkforceManagementEdit = (params) =>
post("/shiftworkrules/edit", params); // 排班管理修改
export const getWorkforceManagementView = (params) =>
post("/shiftworkrules/goEdit", params); // 排班管理查看
export const getWorkforceManagementIsUse = (params) =>
post("/shiftworkrules/isUseTwo", params); // 排班管理查看是否正在使用

View File

@ -86,7 +86,7 @@
<el-table-column label="操作" width="80">
<template #default="{ row }">
<el-button
type="primary"
type="danger"
text
link
@click="fnDelete(row.ARCHIVES_REVIEW_RECORD_ID)"

View File

@ -0,0 +1,75 @@
<template>
<el-dialog v-model="visible" title="请填写结论建议" @close="fnClose">
<div>
<el-input
v-model="advice"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</div>
<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 { debounce } from "throttle-debounce";
import {
setEnterpriseReportConclusionAdd,
setEnterpriseReportConclusionEdit,
} from "@/request/continuous_improvement.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
advice: {
type: String,
required: true,
default: "",
},
corpAdvice: {
type: Object,
required: true,
default: () => ({}),
},
month: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:visible", "update:advice", "submit"]);
const { visible, advice } = useVModels(props, emits);
const fnClose = () => {
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
if (props.corpAdvice.CORPADVICE_ID) {
await setEnterpriseReportConclusionEdit({
...props.corpAdvice,
ADVICE: advice.value,
});
} else {
await setEnterpriseReportConclusionAdd({
ADVICE_DATE: props.month,
ADVICE: advice.value,
});
}
fnClose();
emits("submit");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,76 @@
<template>
<el-drawer v-model="visible" title="查看其他诊断书">
<el-row>
<el-col
v-for="(item, index) in dateList"
:key="index"
:span="6"
:offset="1"
>
<div
style="
text-align: center;
cursor: pointer;
margin-top: 10px;
border-radius: 10px;
"
:style="{
background: adviceDate?.includes(item)
? 'var(--el-border-color)'
: 'var(--el-fill-color-light)',
}"
@click="fnCheck(item)"
>
<div
style="
color: var(--el-text-color-regular);
padding: 10px 0;
border-radius: 10px;
"
:style="{
background: item === month ? 'var(--el-color-primary)' : '',
}"
>
{{ item }}
</div>
</div>
</el-col>
</el-row>
</el-drawer>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
dateList: {
type: Array,
required: true,
default: () => [],
},
adviceDate: {
type: Array,
required: true,
default: () => [],
},
month: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:visible", "update:month", "check"]);
const { visible, month } = useVModels(props, emits);
const fnCheck = (item) => {
visible.value = false;
month.value = item;
emits("check");
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,781 @@
<template>
<layout-card>
<div class="tr">
<el-button v-print="'#printContainer'" type="primary"></el-button>
</div>
<div id="printContainer">
<div class="cover print_use page_break">
<div class="top">
<h1>{{ data.cpd.CORP_NAME }}</h1>
<h1>秦安双重预防机制建设平台</h1>
<h1>体系运行报告</h1>
</div>
<div class="bot">
<h1>{{ data.cpd.CORP_NAME }}</h1>
<h1>{{ dayjs(startDate).format("YYYY年MM月") }}</h1>
</div>
<img src="/src/assets/images/print/cover-bg.png" alt="" />
</div>
<div class="content">
<h1>1.概述</h1>
<p>
{{ data.cpd.CORP_NAME }}公司统一社会信用代码为{{
data.cpd.CODE
}}公司地址{{ data.cpd.COMPANY_AREA }}所属行业{{
data.cpd.CORP_TYPE_NAME
}}主要负责人{{ data.cpd.LR_NAME }}
</p>
<p>
本体系运行报告的数据来源于{{
data.cpd.CORP_NAME
}}秦安双重预防机制建设平台相关数据如企业信息风险管控隐患排查隐患治理教育培训高危作业管理等均取自数据库实际数据
</p>
<p>
本体系运行报告的数据统计时间范围{{
dayjs(startDate).format("YYYY年MM月DD日")
}}-{{ dayjs(lastDate).format("YYYY年MM月DD日") }}
</p>
<h1>2.风险管控</h1>
<h4>2.1 风险点单元</h4>
<p>
截至到{{ dayjs(lastDate).format("YYYY年MM月DD日") }}公司共建立{{
data.riskpd.unit_count
}}个风险点单元
</p>
<h4>2.2 辨识部位</h4>
<p>
截至到{{ dayjs(lastDate).format("YYYY年MM月DD日") }}公司共辨识了{{
data.riskpd.id_count
}}个辨识部位
</p>
<h4>2.3 风险管控信息台账</h4>
<p>
截至到{{ dayjs(lastDate).format("YYYY年MM月DD日") }}公司建立了{{
data.riskpd.risk_count
}}个风险管控信息台账其中重大风险{{ data.riskpd.a_count }}
较大风险{{ data.riskpd.b_count }}一般风险{{
data.riskpd.c_count
}}低风险{{ data.riskpd.d_count }}
</p>
</div>
<div class="content">
<h1>3.隐患排查</h1>
<h4>3.1清单管理</h4>
<p>
截至到{{ dayjs(lastDate).format("YYYY年MM月DD日") }}公司共建立{{
data.lists.length
}}个隐患排查清单其中日常隐患排查清单{{ data.listType0001 }}
综合性隐患排查清单{{ data.listType0002 }}季节性隐患排查清单{{
data.listType0004
}}节假日隐患排查清单{{
data.listType0005
}}专业性隐患排查清单{{ data.listType0003 }}
</p>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司新建了{{ data.monthlist.length }}个排查清单详细情况如下:
</p>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td>清单类型</td>
<td>清单名称</td>
<td>清单负责人</td>
<td>清单建立时间</td>
<td>清单排查周期</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.lists" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ typeMap[item.TYPE] }}</td>
<td>{{ item.NAME }}</td>
<td>{{ item.USER_NAME }}</td>
<td>{{ dayjs(item.CREATTIME).format("YYYY年MM月DD日") }}</td>
<td>{{ periodMap[item.PERIOD] }}</td>
</tr>
<tr v-if="data.lists.length === 0">
<td colspan="6" align="center">暂无数据</td>
</tr>
</tbody>
</table>
<h4>3.2清单排查情况</h4>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司已建立清单用户详细排查情况见表1
</p>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td>部门</td>
<td>岗位</td>
<td>姓名</td>
<td>负责的清单数</td>
<td>应排查清单的次数</td>
<td>实际排查次数</td>
<td>排查率</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.checkList" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ item.DEPARTNAME_ALL }}</td>
<td>{{ item.POSTNAME }}</td>
<td>{{ item.USERNAME }}</td>
<td>{{ item.listCount }}</td>
<td>{{ item.staCount }}</td>
<td>{{ item.cheCount }}</td>
<td>{{ item.percent }}</td>
</tr>
<tr v-if="data.checkList.length === 0">
<td colspan="8" align="center">暂无数据</td>
</tr>
</tbody>
</table>
<h4>3.3隐患治理情况</h4>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司共发现隐患{{ data.hdlist.length }} 其中重大隐患{{
data.zd_count
}}一般隐患{{ data.yb_count }}其中待整改{{
data.dzg_count
}}待验收{{ data.dys_count }}已验收{{
data.yys_count
}}已超期{{ data.cq_count }}
</p>
<p class="subtitle">隐患治理情况见表2</p>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td width="120" align="center">隐患发现时间</td>
<td width="80" align="center">检查人</td>
<td width="80">检查部门</td>
<td width="80">问题描述</td>
<td>整改措施</td>
<td width="80">整改情况</td>
<td width="100">整改前照片</td>
<td width="100">整改后照片</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.hdlist" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ item.CREATTIME }}</td>
<td>{{ item.USER_NAME }}</td>
<td>{{ item.DEPARTMENT_NAME }}</td>
<td>{{ item.HIDDENDESCR }}</td>
<td>{{ item.RECTIFYDESCR }}</td>
<td>
<span v-if="item.STATE === '1'">
{{
item.HIDDENLEVEL === "hiddenLevel0001" ? "待整改" : "整改中"
}}
</span>
<span v-else-if="item.STATE === '3'"> 已整改 </span>
<span v-else-if="item.STATE === '4'"> 已验收 </span>
<span v-else-if="item.STATE === '-1'"> 已超期 </span>
<span v-else-if="item.STATE === '10'"> 验收打回 </span>
<span v-else-if="item.STATE === '100'"> 暂存 </span>
<span v-else-if="item.STATE === '101'"> 待指派 </span>
<span v-else-if="item.STATE === '102'"> 指派中 </span>
</td>
<td>
<viewer :images="[VITE_FILE_URL + item.HD_IMGS]">
<img
v-if="item.HD_IMGS"
:src="VITE_FILE_URL + item.HD_IMGS"
alt=""
/>
</viewer>
</td>
<td>
<viewer :images="[VITE_FILE_URL + item.ZG_IMGS]">
<img
v-if="item.ZG_IMGS"
:src="VITE_FILE_URL + item.ZG_IMGS"
alt=""
/>
</viewer>
</td>
</tr>
<tr v-if="data.hdlist.length === 0">
<td colspan="9" align="center">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="content">
<h1>4.风险分析记录</h1>
<p>改进信息显示风险辨识台账更新记录</p>
<table class="print_table">
<tr>
<td align="center">风险点单元</td>
<td align="center">辨识部位</td>
<td align="center">改进类型</td>
<td align="center">持续改进</td>
<td align="center">存在风险</td>
<td align="center">管控措施</td>
</tr>
<tr v-for="(item, index) in data.riskLog" :key="index">
<td v-if="index % 2 === 0" align="center" rowspan="2">
{{ item.risk_unit_name }}
</td>
<td v-if="index % 2 === 0" rowspan="2">{{ item.parts_name }}</td>
<td v-if="index % 2 === 0" rowspan="2">{{ item.is_new }}</td>
<td>{{ item.label }}</td>
<td>{{ item.risk_descr }}</td>
<td>{{ item.measures }}</td>
</tr>
<tr v-if="data.riskLog.length === 0">
<td colspan="6" align="center">暂无数据</td>
</tr>
</table>
</div>
<div class="content">
<h1>5.教育培训情况</h1>
<h4>5.1教育培训</h4>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司共完成建立{{ data.studypd.curriculum_count }}课程 完成建立{{
data.studypd.paper_count
}}试卷完成建立{{
data.studypd.task_count
}}次学习任务岗位培训类型分别为{{
data.post_type_name_arr.join("")
}}培训时间{{ data.sum_classhour }}分钟 共有{{
data.study_student_count
}}名学员参与平台教育培训考核通过{{
data.study_pass_count
}}通过率{{ data.study_pass_rate || 0 }}%
</p>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td>课程名称</td>
<td>培训类型</td>
<td>任务学时分钟</td>
<td>学员人数</td>
<td>任务状态</td>
<td>应考人数</td>
<td>参考人数/合格人数</td>
<td>通过率</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.studylist" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ item.STUDY_NAME }}</td>
<td>{{ item.train_type_name }}</td>
<td>{{ item.SUM_CLASSHOUR }}</td>
<td>{{ item.userCount }}</td>
<td v-if="item.PEIXUE_START_TIME > dayjs().format('YYYY-MM-DD')">
未开始
</td>
<td
v-else-if="
item.PEIXUE_START_TIME <= dayjs().format('YYYY-MM-DD') &&
item.PEIXUE_END_TIME >= dayjs().format('YYYY-MM-DD')
"
>
进行中
</td>
<td
v-else-if="item.PEIXUE_END_TIME <= dayjs().format('YYYY-MM-DD')"
>
已结束
</td>
<td>{{ item.userCount }}</td>
<td>{{ item.cj }}/{{ item.hg }}</td>
<td>
{{ item.cj === 0 ? 0 : ((item.hg / item.cj) * 100).toFixed(2) }}
</td>
</tr>
</tbody>
<tr v-if="data.studylist.length === 0">
<td colspan="9" align="center">暂无数据</td>
</tr>
</table>
<h4>5.2档案建立情况</h4>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司共完成建立个人档案{{ data.ztask_count }} 一期一档{{
data.studypd.task_count
}}
</p>
</div>
<div class="content">
<h1>6.特殊作业管理</h1>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司共新建{{ data.eight_count }}项特殊作业审批 已存档{{
data.eight_pass_count
}}项审批数据其中受限空间作业{{
data.eightlist?.[2]?.pass_count || 0
}}断路作业{{ data.eightlist?.[4]?.pass_count || 0 }}
盲板抽堵作业{{ data.eightlist?.[0]?.pass_count || 0 }}动土作业{{
data.eightlist?.[1]?.pass_count || 0
}}高处作业{{ data.eightlist?.[5]?.pass_count || 0 }}
吊装作业{{ data.eightlist?.[6]?.pass_count || 0 }}临时用电作业{{
data.eightlist?.[3]?.pass_count || 0
}}动火作业{{ data.eightlist?.[7]?.pass_count || 0 }}
</p>
</div>
<div class="content">
<h1>7.绩效考核</h1>
<p>
{{ dayjs(startDate).format("YYYY年MM月DD日") }}-{{
dayjs(lastDate).format("YYYY年MM月DD日")
}}公司绩效考核详细情况如下
</p>
<h4>7.1 部门考核</h4>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td>部门</td>
<td>发现隐患</td>
<td>隐患整改</td>
<td>检查得分</td>
<td>培训得分</td>
<td>风险辨识完善得分</td>
<td>考核日期</td>
<td>考核等级</td>
<td>合计</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.deptPeList" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ item.DEPT_NAME_ALL }}</td>
<td>{{ item.SCORE1 }}</td>
<td>{{ item.SCORE2 }}</td>
<td>{{ item.SCORE3 }}</td>
<td>{{ item.SCORE4 }}</td>
<td>{{ item.SCORE5 }}</td>
<td>{{ month }}</td>
<td>
{{
fnComputeLevel(
item.SCORE1 +
item.SCORE2 +
item.SCORE3 +
item.SCORE4 +
item.SCORE5
)
}}
</td>
<td>
{{
item.SCORE1 +
item.SCORE2 +
item.SCORE3 +
item.SCORE4 +
item.SCORE5
}}
</td>
</tr>
<tr v-if="data.deptPeList.length === 0">
<td colspan="10" align="center">暂无数据</td>
</tr>
</tbody>
</table>
<h4>7.2 人员考核</h4>
<table class="print_table">
<thead>
<tr>
<td width="60" align="center">序号</td>
<td>部门</td>
<td>人员</td>
<td>发现隐患</td>
<td>隐患整改</td>
<td>检查得分</td>
<td>培训得分</td>
<td>风险辨识完善得分</td>
<td>考核日期</td>
<td>考核等级</td>
<td>合计</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.userPeList" :key="index">
<td align="center">{{ index + 1 }}</td>
<td>{{ item.DEPT_NAME_ALL }}</td>
<td>{{ item.USER_NAME }}</td>
<td>{{ item.SCORE1 }}</td>
<td>{{ item.SCORE2 }}</td>
<td>{{ item.SCORE3 }}</td>
<td>{{ item.SCORE4 }}</td>
<td>{{ item.SCORE5 }}</td>
<td>{{ showDate }}</td>
<td>
{{
fnComputeLevel(
item.SCORE1 +
item.SCORE2 +
item.SCORE3 +
item.SCORE4 +
item.SCORE5
)
}}
</td>
<td>
{{
item.SCORE1 +
item.SCORE2 +
item.SCORE3 +
item.SCORE4 +
item.SCORE5
}}
</td>
</tr>
<tr v-if="data.userPeList.length === 0">
<td colspan="11" align="center">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="content">
<h1>8.结论建议</h1>
<p>
{{ data.corp_advice.ADVICE }}
</p>
</div>
</div>
<div class="tc mt-10">
<el-button type="primary" @click="fnConclusion"></el-button>
</div>
<div class="fixed_right" @click="data.otherVisible = true">
查看其它诊断书
</div>
<conclusion
v-model:visible="data.conclusionDialog.visible"
v-model:advice="data.conclusionDialog.advice"
:corp-advice="data.corp_advice"
:month="month"
@submit="fnGetConclusion"
/>
<other
v-model:visible="data.otherVisible"
v-model:month="month"
:advice-date="data.corp_advice_all"
:date-list="dateList"
@check="fnGetData"
/>
</layout-card>
</template>
<script setup>
import {
getEnterpriseReport1,
getEnterpriseReport2,
getEnterpriseReport3,
getEnterpriseReport4,
getEnterpriseReport5,
getEnterpriseReport6,
getEnterpriseReportConclusion,
} from "@/request/continuous_improvement.js";
import { reactive, ref, watchEffect } from "vue";
import dayjs from "dayjs";
import Conclusion from "./components/conclusion.vue";
import Other from "./components/other.vue";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const typeMap = {
listType0001: "日常隐患排查清单",
listType0002: "综合隐患排查清单",
listType0003: "专业隐患排查清单",
listType0004: "季节性隐患排查清单",
listType0005: "节假日隐患排查清单",
};
const periodMap = {
checkPeriod0001: "每日",
checkPeriod0002: "每周",
checkPeriod0003: "每旬",
checkPeriod0004: "每月",
checkPeriod0005: "每季",
checkPeriod0006: "每年",
checkPeriod0007: "半年",
};
const dateList = ref([]);
const month = ref("");
const startDate = ref("");
const lastDate = ref("");
const data = reactive({
cpd: {},
riskpd: {},
lists: [],
monthlist: [],
hdlist: [],
studypd: {},
riskLog: [],
listType0001: 0,
listType0002: 0,
listType0003: 0,
listType0004: 0,
listType0005: 0,
yb_count: 0,
zd_count: 0,
dzg_count: 0,
dys_count: 0,
yys_count: 0,
cq_count: 0,
checkList: [],
studylist: [],
study_student_count: 0,
sum_classhour: 0,
study_pass_count: 0,
ztask_count: 0,
post_type_name_arr: [],
study_pass_rate: 0,
eightlist: [],
eight_count: 0,
eight_pass_count: 0,
deptPeList: [],
userPeList: [],
corp_advice: {},
corp_advice_all: [],
conclusionDialog: {
visible: false,
advice: "",
},
otherVisible: false,
});
watchEffect(() => {
startDate.value = dayjs(month.value).startOf("month").format("YYYY-MM-DD");
lastDate.value = dayjs(month.value).endOf("month").format("YYYY-MM-DD");
});
const fnGetDateList = () => {
let tempDate = "2022-06";
dateList.value.push(dayjs(tempDate).format("YYYY-MM"));
while (dayjs().diff(dayjs(tempDate), "month") > 0) {
tempDate = dayjs(tempDate).add(1, "month");
dateList.value.push(dayjs(tempDate).format("YYYY-MM"));
}
month.value = dateList.value[dateList.value.length - 1];
};
fnGetDateList();
const fnGetConclusion = async () => {
const resData = await getEnterpriseReportConclusion({ MONTH: month.value });
const resDataAll = await getEnterpriseReportConclusion();
data.corp_advice = resData.varList[0] || {
ADVICE:
"公司安全生产情况良好,需继续依据相关标准积极开展风险分级管控和隐患排查治理体系建设,根据公司目前的安全管理情况,须加强隐患排查、隐患整改等方面的安全管理,提高公司的安全管理水平,防止和减少生产安全事故的发生。",
};
data.corp_advice_all = resDataAll.varList.map((item) => item.ADVICE_DATE);
};
fnGetConclusion();
const fnComputeLevel = (total) => {
if (total >= 75) return "一级";
else if (total >= 50) return "二级";
else if (total >= 25) return "三级";
else return "四级";
};
const fnGetData1 = async () => {
const resData = await getEnterpriseReport1({ MONTH: month.value });
data.cpd = resData.cpd;
data.riskpd = resData.riskpd;
data.lists = resData.lists;
data.monthlist = resData.monthlist;
data.hdlist = resData.hdlist;
data.studypd = resData.studypd;
data.riskLog = resData.riskLog;
data.lists.forEach((item) => {
if (item.TYPE === "listType0001") data.listType0001++;
else if (item.TYPE === "listType0002") data.listType0002++;
else if (item.TYPE === "listType0003") data.listType0003++;
else if (item.TYPE === "listType0004") data.listType0004++;
else if (item.TYPE === "listType0005") data.listType0005++;
});
data.hdlist.forEach((item) => {
if (item.HIDDENLEVEL === "hiddenLevel0001") data.yb_count++;
else data.zd_count++;
if (item.STATE === "1") data.dzg_count++;
else if (item.STATE === "2" || item.STATE === "3") data.dys_count++;
else if (item.STATE === "4") data.yys_count++;
else if (item.STATE === "-1") data.cq_count++;
});
};
const fnGetData2 = async () => {
const resData = await getEnterpriseReport2({
STARTTIME: startDate.value,
ENDTIME: lastDate.value,
});
data.checkList = resData.varList;
};
const fnGetData3 = async () => {
const resData = await getEnterpriseReport3({ MONTH: month.value });
data.studylist = resData.varList;
const post_type_name_set = new Set();
data.study_student_count = 0;
data.sum_classhour = 0;
data.study_pass_count = 0;
data.ztask_count = 0;
data.studylist.forEach((item) => {
post_type_name_set.add(item.post_type_name);
data.sum_classhour += item.SUM_CLASSHOUR;
data.study_student_count += item.cj;
data.study_pass_count += item.hg;
data.ztask_count += item.userCount;
});
if (post_type_name_set.size > 0) {
data.post_type_name_arr = Array.from(post_type_name_set);
}
if (data.study_student_count > 0) {
data.study_pass_rate = (
(data.study_pass_count / data.study_student_count) *
100
).toFixed(2);
}
};
const fnGetData4 = async () => {
const resData = await getEnterpriseReport4({ MONTH: month.value });
data.eightlist = resData.eightlist;
data.eight_count = 0;
data.eight_pass_count = 0;
data.eightlist.forEach((item) => {
data.eight_count += +item.count;
data.eight_pass_count += +item.pass_count || 0;
});
};
const fnGetData5 = async () => {
const resData = await getEnterpriseReport5({ MONTH: month.value });
data.deptPeList = resData.varList;
};
const fnGetData6 = async () => {
const resData = await getEnterpriseReport6({ MONTH: month.value });
data.userPeList = resData.varList;
};
const fnGetData = async () => {
await fnGetData1();
await fnGetData2();
await fnGetData3();
await fnGetData4();
await fnGetData5();
await fnGetData6();
};
fnGetData();
const fnConclusion = () => {
data.conclusionDialog.visible = true;
data.conclusionDialog.advice = data.corp_advice.ADVICE;
};
</script>
<style scoped lang="scss">
.cover {
position: relative;
.top {
padding-top: 400px;
h1 {
font-size: 34px;
text-align: center;
}
}
.bot {
padding-top: 200px;
h1 {
font-size: 18px;
text-align: center;
}
}
img {
position: absolute;
left: 0;
right: 0;
bottom: -100px;
height: 407px;
width: 100%;
z-index: -1;
}
}
.content {
position: relative;
.subtitle {
text-align: center;
text-indent: 0;
margin-bottom: 1em;
font-weight: bold;
}
h1 {
font-size: 20px;
}
h4 {
font-size: 16px;
text-indent: 34px;
}
p {
text-indent: 34px;
margin: 0 0 0.2em;
line-height: 1.6;
}
}
img {
width: 100px;
height: 100px;
}
p,
h1,
h2,
h3,
h4,
h5,
h6 {
margin-bottom: 1em;
margin-top: 1em;
}
.fixed_right {
position: fixed;
right: -29px;
top: 50%;
transform: translate(-50%, -50%);
color: #ffffff;
clip-path: polygon(
100% 0%,
100% 0%,
100% 0%,
100% 100%,
100% 100%,
100% 100%,
65% 85%,
65% 17%
);
width: 100px;
writing-mode: tb-rl;
padding: 50px 10px 50px 0;
background-color: var(--el-color-primary);
cursor: pointer;
font-size: 14px;
}
</style>

View File

@ -0,0 +1,76 @@
<template>
<el-dialog v-model="visible" title="分析" :before-close="fnClose">
<layout-risk-add ref="riskAddRef" v-model:form="form" :rules="rules">
<el-col :span="24">
<el-form-item label="是否生成新风险因素" prop="IS_NEW">
<el-radio-group v-model="form.IS_NEW" disabled>
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</layout-risk-add>
<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 { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import LayoutRiskAdd from "@/components/risk_add/index.vue";
import { ref, watch } from "vue";
import { setHazardAnalysisSubmit } from "@/request/continuous_improvement.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
form: {
type: Object,
required: true,
default: () => ({}),
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
IS_NEW: [{ required: true, message: "请选择", trigger: "change" }],
};
const riskAddRef = ref(null);
const fnClose = () => {
riskAddRef.value.reset();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await riskAddRef.value.formValidate();
await setHazardAnalysisSubmit({
STATUS: 0,
ACCIDENTS: form.value.ACCIDENTS.join(","),
ACCIDENTS_NAME: riskAddRef.value.accidentsName(),
...form.value,
});
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
watch(
() => props.form.IDENTIFICATION_ID,
(newValue, oldValue) => {
if (oldValue) {
form.value.IS_NEW = 1;
}
}
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,221 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@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="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="隐患发现人" prop="CREATORNAME">
<el-input v-model="searchForm.CREATORNAME" />
</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="隐患级别" prop="HIDDENLEVEL">
<el-select v-model="searchForm.HIDDENLEVEL">
<el-option
v-for="item in hazardLevelList"
: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
v-model:pagination="pagination"
:data="list"
@get-data="fnGetDataTransfer"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="HIDDENDESCR"
label="隐患描述"
show-overflow-tooltip
/>
<el-table-column label="隐患处置" width="100">
<template #default="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '1'"></span>
<span v-else-if="row.RECTIFICATIONTYPE === '2'">限期整改</span>
</template>
</el-table-column>
<el-table-column prop="HIDDENLEVELNAME" label="隐患级别" width="120" />
<el-table-column label="隐患状态" width="100">
<template #default="{ row }">
{{ translationStatus(row.STATE, stateList) }}
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="发现时间" width="160" />
<el-table-column prop="CREATORNAME" label="发现人" width="100" />
<el-table-column
prop="RECTIFICATIONTIME"
label="整改时间"
width="160"
/>
<el-table-column
prop="RECTIFICATIONORNAME"
label="整改人"
width="100"
/>
<el-table-column label="验收人" width="100">
<template #default="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '2'">
{{ row.CHECKNAME }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/continuous_improvement/hazard_analysis/view',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
查看
</el-button>
<el-button type="primary" text link @click="fnAnalysis(row)">
分析
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<analysis
v-model:visible="data.analysisDialog.visible"
v-model:form="data.analysisDialog.form"
@get-data="fnResetPaginationTransfer"
/>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import { getHiddenDangerList } from "@/request/hidden_danger_government.js";
import { layoutFnGetHazardLevel } from "@/assets/js/data_dictionary.js";
import { nextTick, reactive } from "vue";
import Analysis from "./components/analysis.vue";
import { getRiskControlLedgerView } from "@/request/risk_control.js";
const stateList = [
{ NAME: "未整改", ID: "1" },
{ NAME: "已整改", ID: "2" },
{ NAME: "已整改", ID: "3" },
{ NAME: "已验收", ID: "4" },
{ NAME: "已过期", ID: "-1" },
];
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHiddenDangerList, {
otherParams: { STATE: 4, DISPOSESTATE: "-1", ANALYSIS: 1 },
});
const data = reactive({
analysisDialog: {
visible: false,
form: {
DEPARTMENT_ID: "",
USER_ID: "",
RISK_UNIT_ID: "",
IDENTIFICATION_ID: "",
RISK_DESCR: "",
LIKELIHOOD: "",
EXPOSURE: "",
CONSEQUENCE: "",
LEVEL_NAME: "",
DANGER: "",
MEASURES: "",
ACCIDENTS: [],
EME_MEASURES: "",
IS_NEW: 1,
},
},
});
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(","),
});
};
const hazardLevelList = await layoutFnGetHazardLevel();
const fnAnalysis = async ({
HIDDEN_ID,
RISKPOINT_ID,
HIDDENDESCR,
RECTIFYDESCR,
}) => {
data.analysisDialog.visible = true;
await nextTick();
if (RISKPOINT_ID) {
const resData = await getRiskControlLedgerView({ RISKPOINT_ID });
resData.pd.IS_NEW = 0;
data.analysisDialog.form = resData.pd;
data.analysisDialog.form.ACCIDENTS = resData.pd.ACCIDENTS.split(",");
data.analysisDialog.form.RISK_DESCR += HIDDENDESCR;
data.analysisDialog.form.MEASURES += RECTIFYDESCR;
}
data.analysisDialog.form.HIDDEN_ID = HIDDEN_ID;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,9 @@
<template>
<hidden-view print />
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/hidden_danger_view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,83 @@
<template>
<el-dialog v-model="visible" title="分析" @close="fnClose">
<layout-risk-view :info="info">
<el-descriptions-item label="是否生成新风险因素" :span="2">
{{ info.IS_NEW === 1 ? "是" : "否" }}
</el-descriptions-item>
<el-descriptions-item label="风险成因" :span="2">
<el-select v-model="riskCauses" placeholder="请选择">
<el-option
v-for="item in riskCausesList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-descriptions-item>
</layout-risk-view>
<template #footer>
<el-button type="primary" @click="fnSubmit(1)"></el-button>
<el-button type="danger" @click="fnSubmit(0)"></el-button>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { ref } from "vue";
import { layoutFnGetRiskCauses } from "@/assets/js/data_dictionary.js";
import { debounce } from "throttle-debounce";
import {
setRiskAnalysisAdopt,
setRiskAnalysisRepulse,
} from "@/request/continuous_improvement.js";
import { ElMessage } from "element-plus";
import LayoutRiskView from "@/components/risk_view/index.vue";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => ({}),
},
});
const emits = defineEmits(["update:visible", "get-data"]);
const visible = useVModel(props, "visible", emits);
const riskCauses = ref("");
const riskCausesList = await layoutFnGetRiskCauses();
const fnClose = () => {
visible.value = false;
riskCauses.value = "";
};
const fnSubmit = debounce(
1000,
async (STATUS) => {
if (STATUS === 0) {
await setRiskAnalysisRepulse({
RISKPOINT_ANALYSIS_ID: props.info.RISKPOINT_ANALYSIS_ID,
});
} else {
if (!riskCauses.value) {
ElMessage.warning("风险成因未选择");
return;
}
await setRiskAnalysisAdopt({
RISKPOINT_ANALYSIS_ID: props.info.RISKPOINT_ANALYSIS_ID,
RISK_CAUSES: riskCauses.value,
});
}
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,189 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@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="LEVELID">
<el-select v-model="searchForm.LEVELID">
<el-option
v-for="item in riskClassificationList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</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="事故类型">
<el-select v-model="searchForm.BIANMA" multiple>
<el-option
v-for="item in accidentTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="管控责任人" prop="gkzrName">
<el-input v-model="searchForm.gkzrName" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否审核" prop="STATUS">
<el-select v-model="searchForm.STATUS">
<el-option label="未审核" value="0" />
<el-option label="已审核" value="1" />
</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
v-model:pagination="pagination"
:data="list"
@get-data="fnGetDataTransfer"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="DEPT_NAME_ALL" label="管控部门" width="250" />
<el-table-column
prop="RISKUNITNAME"
label="风险点(单元)"
width="250"
/>
<el-table-column prop="PARTSNAME" label="辨识部位" width="250" />
<el-table-column prop="LEVELID" label="风险分级" width="120">
<template #default="{ row }">
<span v-if="row.LEVELID === 'levelD'" class="text-blue">
低风险/D级
</span>
<span v-else-if="row.LEVELID === 'levelC'" class="text-yellow">
一般风险/C级
</span>
<span v-else-if="row.LEVELID === 'levelB'" class="text-orange">
较大风险/B级
</span>
<span v-else-if="row.LEVELID === 'levelA'" class="text-red">
重大风险/A级
</span>
</template>
</el-table-column>
<el-table-column prop="ACCIDENTS_NAME" label="事故类型" />
<el-table-column prop="USER_ID" label="管控责任人" width="100" />
<el-table-column prop="STATUS" label="状态" width="90">
<template #default="{ row }">
{{ row.STATUS === 1 ? "已审核" : "未审核" }}
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
v-if="row.STATUS === 0"
type="primary"
text
link
@click="fnAnalysis(row)"
>
分析
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<analysis
v-model:visible="data.analysisDialog.visible"
:info="data.analysisDialog.info"
@get-data="fnResetPaginationTransfer"
/>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import {
layoutFnGetAccidentType,
layoutFnGetRiskClassification,
} from "@/assets/js/data_dictionary.js";
import { reactive } from "vue";
import { getRiskAnalysisList } from "@/request/continuous_improvement.js";
import { useUserStore } from "@/pinia/user.js";
import { ElMessageBox } from "element-plus";
import { cloneDeep } from "lodash-es";
import Analysis from "./components/analysis.vue";
const userStore = useUserStore();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getRiskAnalysisList);
const data = reactive({
analysisDialog: {
visible: false,
info: {},
},
});
const fnGetDataTransfer = () => {
fnGetData({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
BIANMA: searchForm.value.BIANMA?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
BIANMA: searchForm.value.BIANMA?.join(","),
});
};
const riskClassificationList = await layoutFnGetRiskClassification();
const accidentTypeList = await layoutFnGetAccidentType();
const fnAnalysis = (row) => {
if (
userStore.getUserInfo.ISMAIN === "1" ||
userStore.getUserInfo.IS_SAFETY === 1
) {
data.analysisDialog.visible = true;
data.analysisDialog.info = cloneDeep(row);
} else {
ElMessageBox.alert("您无权进行此项操作");
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,37 @@
<template>
<el-dialog v-model="visible" title="查看">
<layout-risk-view :info="info">
<el-descriptions-item label="是否生成新风险因素" :span="2">
{{ info.IS_NEW === 1 ? "是" : "否" }}
</el-descriptions-item>
<el-descriptions-item label="风险成因" :span="2">
{{ info.RISK_CAUSES }}
</el-descriptions-item>
</layout-risk-view>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import LayoutRiskView from "@/components/risk_view/index.vue";
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);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,165 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@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="风险点" prop="RISK_UNIT_ID">
<el-select
v-model="searchForm.RISK_UNIT_ID"
@change="fnGetPartsList"
>
<el-option
v-for="item in data.unitList"
:key="item.RISKUNIT_ID"
:label="item.DEPT_NAME + '-' + item.RISKUNITNAME"
:value="item.RISKUNIT_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="辨识部位" prop="IDENTIFICATION_ID">
<el-select v-model="searchForm.IDENTIFICATION_ID">
<el-option
v-for="item in data.partsList"
:key="item.IDENTIFICATIONPARTS_ID"
:label="item.PARTSNAME"
:value="item.IDENTIFICATIONPARTS_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="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
v-model:pagination="pagination"
:data="list"
:span-method="fnSpanMethod"
@get-data="fnGetData"
>
<el-table-column
fixed
prop="risk_unit_name"
label="风险点(单元)"
width="200px"
/>
<el-table-column prop="parts_name" label="辨识部位" width="200px" />
<el-table-column prop="is_new" label="改进类型" width="80" />
<el-table-column prop="label" label="持续改进" width="100" />
<el-table-column
prop="risk_causes_name"
label="风险成因"
width="150px"
/>
<el-table-column prop="risk_descr" label="存在风险" width="500px" />
<el-table-column prop="dname5" label="风险等级" width="100" />
<el-table-column prop="measures" label="管控措施" width="500px" />
<el-table-column prop="accidents_name" label="事故类型" width="300px" />
<el-table-column prop="dept_name_all" label="责任部门" width="150px" />
<el-table-column label="责任人" width="150px">
<template #default="{ row }">
{{ row.dept_user_name ? row.dept_user_name : row.user_id }}
</template>
</el-table-column>
<el-table-column prop="creat_time" label="分析时间" width="150px" />
<el-table-column prop="creator_name" label="分析人员" width="150px" />
<el-table-column prop="inspector_name" label="审批人员" width="150px" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button type="primary" text link @click="fnView(row)">
查看最新信息
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<view-info
v-model:visible="data.viewDialog.visible"
:info="data.viewDialog.info"
/>
</div>
</template>
<script setup>
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import {
getRiskAnalysisRecordList,
getRiskAnalysisRecordView,
} from "@/request/continuous_improvement.js";
import {
getIdentifyingPartsListAll,
getRiskPointListAllById,
} from "@/request/risk_control.js";
import ViewInfo from "./components/view.vue";
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getRiskAnalysisRecordList, { key: "list" });
const data = reactive({
unitList: [],
partsList: [],
viewDialog: {
visible: false,
info: {},
},
});
const fnGetUnitList = async () => {
const resData = await getRiskPointListAllById({
DEPARTMENT_ID: "",
});
data.unitList = resData.unitList;
};
const fnGetPartsList = async () => {
searchForm.value.IDENTIFICATION_ID = "";
const resData = await getIdentifyingPartsListAll({
RISK_UNIT_ID: searchForm.value.RISK_UNIT_ID,
});
data.partsList = resData.partsList;
};
fnGetUnitList();
const fnView = async (row) => {
const resData = await getRiskAnalysisRecordView({
RISKPOINT_ANALYSIS_ID: row.riskpoint_analysis_id,
});
data.viewDialog.visible = true;
data.viewDialog.info = resData.form;
};
const fnSpanMethod = ({ rowIndex, columnIndex }) => {
const arr = [0, 1, 2, 14];
if (arr.includes(columnIndex)) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1,
};
} else {
return {
rowspan: 0,
colspan: 0,
};
}
}
};
</script>
<style scoped></style>

View File

@ -7,9 +7,9 @@
<el-form ref="formRef" :rules="rules" :model="form" label-width="100px">
<el-form-item label="问询内容" prop="INQUIRYCONTENT">
<el-input
v-model="form.INQUIRYCONTENT"
type="textarea"
:autosize="{ minRows: 5 }"
v-model="form.INQUIRYCONTENT"
type="textarea"
:autosize="{ minRows: 5 }"
/>
</el-form-item>
</el-form>
@ -26,7 +26,10 @@ import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import {setDrivingCommitmentAdd, setDrivingCommitmentEdit} from "@/request/traffic_driving_commitment.js";
import {
setDrivingCommitmentAdd,
setDrivingCommitmentEdit,
} from "@/request/traffic_driving_commitment.js";
const props = defineProps({
visible: {

View File

@ -9,7 +9,10 @@
<el-row>
<el-col :span="6">
<el-form-item label="问询内容" prop="INQUIRYCONTENT">
<el-input v-model="searchForm.INQUIRYCONTENT" />
<el-input
v-model="searchForm.INQUIRYCONTENT"
placeholder="请输入问询内容"
/>
</el-form-item>
</el-col>
@ -35,15 +38,17 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="INQUIRYCONTENT" label="问询内容" width="800" />
<el-table-column
prop="INQUIRYCONCLUSION"
label="问询结果"
width="230"
/>
<el-table-column prop="CREATTIME" label="创建时间" width="200" />
<el-table-column prop="OPERATTIME" label="修改时间" width="200" />
<el-table-column label="操作">
<el-table-column prop="INQUIRYCONTENT" label="问询内容" />
<el-table-column prop="INQUIRYCONCLUSION" label="问询结果" width="100">
<template #default="{ row }">
<el-tag v-if="row.INQUIRYCONCLUSION === '1'" type="success"
>正常</el-tag
>
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="创建时间" width="150" />
<el-table-column prop="OPERATTIME" label="修改时间" width="150" />
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"

View File

@ -19,6 +19,7 @@
<span v-if="data.info.WAYBILLSTATUS === '0'"></span>
<span v-else-if="data.info.WAYBILLSTATUS === '1'">已出发</span>
<span v-else-if="data.info.WAYBILLSTATUS === '2'">已完成</span>
<span v-else-if="data.info.WAYBILLSTATUS === '3'">未承诺</span>
</td>
</tr>
<tr>
@ -46,14 +47,56 @@
<td class="title" colspan="1">收车地点</td>
<td colspan="5">{{ data.info.DESTINATION_NAME }}</td>
</tr>
<tr>
<!-- <tr>
<td :rowspan="4" class="title">行车安全问询</td>
</tr>
<tr v-for="(item, index) in data.commitmentList" :key="index">
<td colspan="9">
<span>{{ item.INQUIRYCONTENT }}</span>
</td>
</tr>-->
<tr v-for="(item, index) in data.info.varList2" :key="index">
<td :rowspan="1" class="title">行车安全问询</td>
<td colspan="8">
<table
v-for="(item1, index1) in item.pd1Children"
:key="index1"
class="archive_print_table"
>
<tr>
<td :rowspan="10" class="title">承诺记录</td>
</tr>
<tr v-for="(item2, index2) in data.commitmentList" :key="index2">
<td class="title">承诺项</td>
<td>{{ item2.INQUIRYCONTENT }}</td>
<td>
<el-tag v-if="item2.STATUS === '0'"></el-tag>
<el-tag v-else-if="item2.STATUS === '1'">不合格</el-tag>
<el-tag v-else></el-tag>
</td>
</tr>
<tr>
<td class="title">检查人</td>
<td colspan="3">
<img
v-viewer
:src="VITE_FILE_URL + item1.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<tr>
<td class="title">检查时间</td>
<td colspan="3">{{ item1.SIGN_TIME }}</td>
</tr>
</table>
</td>
</tr>
<tr v-for="(item, index) in data.info.varList" :key="index">
<td :rowspan="1" class="title">{{ item.CHECKTYPE_NAME }}检查</td>
<td colspan="8">
@ -70,6 +113,10 @@
<td>{{ item2.CHECKITEMNAME }}</td>
<td class="title">检查项说明</td>
<td>{{ item2.REMARKS }}</td>
<td>
<el-tag v-if="item2.STATUS === '0'"></el-tag>
<el-tag v-else></el-tag>
</td>
</tr>
<tr>
<td class="title">检查人</td>
@ -84,11 +131,11 @@
/>
</td>
<td class="title">检查时间</td>
<td>{{ item1.SIGN_TIME }}</td>
<td colspan="2">{{ item1.SIGN_TIME }}</td>
</tr>
<tr>
<tr v-if="item.CHECKTYPE_NAME !== '待承诺'">
<td class="title">检查照片</td>
<td colspan="1">
<td colspan="4">
<div>
<template
v-for="(item3, index3) in item1.IMG_PATH.split(',')"
@ -105,15 +152,6 @@
</template>
</div>
</td>
<td v-if="item.CHECKTYPE_NAME === '出车前'" class="title">
是否合格
</td>
<td v-if="item.CHECKTYPE_NAME === '出车前'" colspan="3">
<el-tag v-if="item1.pd2Children[0].STATUS === '0'"
>合格</el-tag
>
<el-tag v-else></el-tag>
</td>
</tr>
<!-- <tr v-if="item.CHECKTYPE_NAME === '出车前'">-->
<!-- <td class="title">是否合格</td>-->

View File

@ -50,20 +50,21 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="WAYBILLNUMBER" label="运单编号" width="230" />
<el-table-column label="行车状态" width="130">
<el-table-column prop="WAYBILLNUMBER" label="运单编号" />
<el-table-column label="行车状态" width="80">
<template #default="{ row }">
<el-tag v-if="row.WAYBILLSTATUS === '0'"></el-tag>
<el-tag v-else-if="row.WAYBILLSTATUS === '1'">已出发</el-tag>
<el-tag v-else-if="row.WAYBILLSTATUS === '2'">收车后</el-tag>
<el-tag v-else-if="row.WAYBILLSTATUS === '3'">待承诺</el-tag>
</template>
</el-table-column>
<el-table-column prop="TRANSPORTVEHICLE" label="运输车辆" width="230" />
<el-table-column prop="NAME" label="从业人员" width="130" />
<el-table-column prop="PHONE" label="联系电话" width="130" />
<el-table-column prop="STARTTIME" label="发车时间" />
<el-table-column prop="STOPTIME" label="收车时间" />
<el-table-column label="操作" width="180">
<el-table-column prop="TRANSPORTVEHICLE" label="运输车辆" width="100" />
<el-table-column prop="NAME" label="从业人员" />
<el-table-column prop="PHONE" label="联系电话" />
<el-table-column prop="STARTTIME" label="发车时间" width="150" />
<el-table-column prop="STOPTIME" label="收车时间" width="150" />
<el-table-column label="操作" width="50">
<template #default="{ row }">
<el-button
type="primary"

View File

@ -8,21 +8,21 @@
<el-form-item label="排查项类型" prop="CHECKTYPE_ID">
<el-select v-model="form.CHECKTYPE_ID">
<el-option
v-for="item in drivingTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
v-for="item in drivingTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
<el-form-item label="排查项名称" prop="CHECKITEMNAME">
<el-input v-model="form.CHECKITEMNAME"/>
<el-input v-model="form.CHECKITEMNAME" />
</el-form-item>
<el-form-item label="排查项说明" prop="REMARKS">
<el-input
v-model="form.REMARKS"
type="textarea"
:autosize="{ minRows: 5 }"
v-model="form.REMARKS"
type="textarea"
:autosize="{ minRows: 5 }"
/>
</el-form-item>
</el-form>
@ -39,8 +39,11 @@ import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import {setDrivingTypeAdd, setDrivingTypeEdit} from "@/request/traffic_driving_type.js";
import {layoutFnGetDrivingType} from "@/assets/js/data_dictionary.js";
import {
setDrivingTypeAdd,
setDrivingTypeEdit,
} from "@/request/traffic_driving_type.js";
import { layoutFnGetDrivingType } from "@/assets/js/data_dictionary.js";
const props = defineProps({
visible: {
@ -68,9 +71,7 @@ const rules = {
CHECKITEMNAME: [
{ required: true, message: "排查项名称不能为空", trigger: "blur" },
],
REMARKS: [
{ required: true, message: "排查项说明不能为空", trigger: "blur" },
],
REMARKS: [{ required: true, message: "排查项说明不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const fnClose = () => {

View File

@ -42,12 +42,27 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CHECKITEMNAME" label="检查项名称" width="330" />
<el-table-column prop="CHECKTYPE_NAME" label="检查项类型" width="230" />
<el-table-column prop="REMARKS" label="检查项说明" width="330" />
<el-table-column prop="CREATTIME" label="创建时间" width="230" />
<el-table-column prop="OPERATTIME" label="修改时间" width="230" />
<el-table-column label="操作">
<el-table-column prop="CHECKITEMNAME" label="检查项名称" />
<el-table-column prop="CHECKTYPE_NAME" label="检查项类型" width="80">
<template #default="{ row }">
<el-tag v-if="row.CHECKTYPE_NAME === '出车前'" type="warning">{{
row.CHECKTYPE_NAME
}}</el-tag>
<el-tag v-if="row.CHECKTYPE_NAME === '行车中'">{{
row.CHECKTYPE_NAME
}}</el-tag>
<el-tag v-if="row.CHECKTYPE_NAME === '收车后'" type="success">{{
row.CHECKTYPE_NAME
}}</el-tag>
<el-tag v-if="row.CHECKTYPE_NAME === '待承诺'" type="error">{{
row.CHECKTYPE_NAME
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="REMARKS" label="检查项说明" />
<el-table-column prop="CREATTIME" label="创建时间" width="150" />
<el-table-column prop="OPERATTIME" label="修改时间" width="150" />
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"

View File

@ -68,7 +68,7 @@
查看
</el-button>
<el-button
type="primary"
type="danger"
text
link
@click="fnDelete(row.REVIEW_USER_ID)"

View File

@ -44,7 +44,7 @@
查看
</el-button>
<el-button
type="primary"
type="danger"
text
link
@click="fnDelete(row.USERSIGNID)"

View File

@ -10,22 +10,6 @@
<el-divider content-position="left">添加</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="客户类型" prop="CUSTOMERTYPE">
<el-select
v-model="data.form.CUSTOMERTYPE"
placeholder="请选择客户类型"
clearable
>
<el-option
v-for="item in CUSTOMERTYPEMENU"
:key="item.id"
:label="item.id"
:value="item.name"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="CUSTOMERNAME">
<el-input
@ -51,6 +35,7 @@
<el-form-item
:label="'联系人' + (index + 1)"
:prop="`contacts.${index}.CONTACT`"
:rules="{ required: true, message: '请输入联系人' }"
>
<el-input
v-model="contact.CONTACT"
@ -63,11 +48,27 @@
<el-form-item
:label="'联系电话' + (index + 1)"
:prop="`contacts.${index}.CONTACTPHONE`"
:rules="[
{ required: true, message: '请输入联系电话' },
{
min: 11,
max: 11,
message: '请输入11位手机号码',
trigger: 'blur',
},
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: '请输入正确的手机号码',
},
]"
>
<el-input
v-model="contact.CONTACTPHONE"
placeholder="请输入联系电话"
clearable
maxlength="11"
show-word-limit
/>
</el-form-item>
</el-col>
@ -75,6 +76,7 @@
<el-form-item
:label="'客户地址' + (index + 1)"
:prop="`contacts.${index}.CUSTOMERADDRESS`"
:rules="{ required: true, message: '请输入客户地址' }"
>
<el-input
v-model="contact.CUSTOMERADDRESS"
@ -103,9 +105,7 @@
</template>
<script setup>
import { CUSTOMERTYPEMENU } from "@/assets/js/constant";
import { getSecurityPerson } from "@/request/waybill_registration.js";
import { onMounted, reactive, ref } from "vue";
import { reactive, ref } from "vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { addSafetyCustomerView } from "@/request/customer_management.js";
@ -139,13 +139,6 @@ const data = reactive({
},
});
const router = useRouter();
onMounted(async () => {
await fnPerson();
});
const fnPerson = async () => {
const resData = await getSecurityPerson({});
data.unitsList = [resData.pd];
};
const addContact = () => {
data.form.contacts.push({
@ -177,7 +170,7 @@ const fnSubmit = async () => {
await addSafetyCustomerView(formData);
ElMessage.success("添加成功");
router.push("/electronic_waybill_management/customer_management");
router.back();
//
data.form.TRANSPORTATIONCOMPANY = "";
data.form.CUSTOMERTYPE = "";

View File

@ -0,0 +1,228 @@
<template>
<layout-card>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="175px"
>
<!-- 承运信息 -->
<el-divider content-position="left">修改</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="客户名称" prop="CUSTOMERNAME">
<el-input
v-model="data.form.CUSTOMERNAME"
placeholder="请输入客户名称"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="23">
<el-form-item class="end">
<el-button type="primary" @click="addContact"></el-button>
</el-form-item>
</el-col>
</el-row>
<div v-for="(contact, index) in data.form.contacts" :key="index">
<el-row :gutter="24">
<el-col :span="7">
<el-form-item
:label="'联系人' + (index + 1)"
:prop="`contacts.${index}.CONTACT`"
:rules="{ required: true, message: '请输入联系人' }"
>
<el-input
v-model="contact.CONTACT"
placeholder="请输入联系人"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item
:label="'联系电话' + (index + 1)"
:prop="`contacts.${index}.CONTACTPHONE`"
:rules="[
{ required: true, message: '请输入联系电话' },
{
min: 11,
max: 11,
message: '请输入11位手机号码',
trigger: 'blur',
},
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: '请输入正确的手机号码',
},
]"
>
<el-input
v-model="contact.CONTACTPHONE"
placeholder="请输入联系电话"
clearable
maxlength="11"
show-word-limit
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item
:label="'客户地址' + (index + 1)"
:prop="`contacts.${index}.CUSTOMERADDRESS`"
:rules="{ required: true, message: '请输入客户地址' }"
>
<el-input
v-model="contact.CUSTOMERADDRESS"
placeholder="请输入客户地址"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="2">
<el-button
v-if="index !== 0"
type="danger"
@click="
removeContact(
index,
contact.CUSTOMERCONTACT_ID,
contact.CONTACT
)
"
>
删除
<!-- 添加的删除文字 -->
</el-button>
</el-col>
</el-row>
</div>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import { reactive, ref } from "vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getTrafficCustomerSelectView,
editSafetyCustomerInfo,
deleteContactInfo,
} from "@/request/customer_management.js";
import { useRoute, useRouter } from "vue-router";
const route = useRoute();
const CUSTOMERMANAGEMENT_ID = route.query.CUSTOMERMANAGEMENT_ID;
const formRef = ref(null);
const rules = {
TRANSPORTATIONCOMPANY: [
{ required: true, message: "请输入运输企业名称", trigger: "blur" },
],
CUSTOMERTYPE: [
{ required: true, message: "请输入客户类型", trigger: "blur" },
],
CUSTOMERNAME: [
{ required: true, message: "请选择客户名称", trigger: "change" },
],
};
const data = reactive({
form: {
TRANSPORTATIONCOMPANY: "",
CUSTOMERTYPE: "",
CUSTOMERNAME: "",
contacts: [
{
CUSTOMERCONTACT_ID: "",
CONTACT: "",
CONTACTPHONE: "",
CUSTOMERADDRESS: "",
},
],
CUSTOMERCONTACT_IDS: [],
CUSTOMERCONTACT_ID: "",
},
});
const router = useRouter();
const fnGetData = async () => {
if (!CUSTOMERMANAGEMENT_ID) return;
const resData = await getTrafficCustomerSelectView({ CUSTOMERMANAGEMENT_ID });
data.form = resData.pd;
data.form.contacts = resData.pd.customercontactList;
};
fnGetData();
const addContact = () => {
data.form.contacts.push({
CONTACT: "",
CONTACTPHONE: "",
CUSTOMERADDRESS: "",
});
};
//
const removeContact = async (index, CUSTOMERCONTACT_ID, CONTACT) => {
await ElMessageBox.confirm(`确定要删除联系人 ` + CONTACT + ` 吗?`, {
type: "warning",
});
if (index > 0) {
//
const result = await deleteContactInfo({ CUSTOMERCONTACT_ID });
if (result.pd) {
ElMessage.warning("此联系人已在运单中存在,无法删除");
} else {
data.form.contacts.splice(index, 1);
ElMessage.success("删除成功");
}
}
};
const fnSubmit = async () => {
await useFormValidate(formRef);
const formData = new FormData();
formData.append("TRANSPORTATIONCOMPANY", data.form.TRANSPORTATIONCOMPANY);
formData.append("CUSTOMERTYPE", data.form.CUSTOMERTYPE);
formData.append("CUSTOMERNAME", data.form.CUSTOMERNAME);
// contactsJSON
const contactsJson = JSON.stringify(data.form.contacts);
// 使JSONcontacts
formData.append("contacts", contactsJson);
formData.append("CUSTOMERMANAGEMENT_ID", CUSTOMERMANAGEMENT_ID);
await editSafetyCustomerInfo(formData);
ElMessage.success("修改成功");
router.back();
//
data.form.TRANSPORTATIONCOMPANY = "";
data.form.CUSTOMERTYPE = "";
data.form.CUSTOMERNAME = "";
data.form.contacts = [
{
CONTACT: "",
CONTACTPHONE: "",
CUSTOMERADDRESS: "",
},
];
};
</script>
<style scoped lang="scss">
.flexBox {
display: flex;
align-items: flex-end;
.addBtn {
margin-left: 12px;
}
}
</style>

View File

@ -8,23 +8,12 @@
>
<el-row>
<el-col :span="6">
<el-form-item label="客户类型" prop="CUSTOMERTYPE">
<el-select v-model="searchForm.CUSTOMERTYPE" clearable>
<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="运输企业" prop="TRANSPORTATIONCOMPANY">
<el-select v-model="searchForm.TRANSPORTATIONCOMPANY" clearable>
<el-option
v-for="item in data.unitsList"
:key="item.CORPINFO_ID"
:label="item.CORP_NAME"
:value="item.CORP_NAME"
/>
</el-select>
<el-form-item label="客户名称" prop="CUSTOMERNAME">
<el-input
v-model="searchForm.CUSTOMERNAME"
placeholder="请输入客户名称"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -51,25 +40,26 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CUSTOMERTYPE" label="客户类型" width="200">
<template #default="{ row }">
{{
row.CUSTOMERTYPE === "1"
? "委托方"
: row.CUSTOMERTYPE === "2"
? "确认方"
: ""
}}
</template>
</el-table-column>
<el-table-column prop="CUSTOMERNAME" label="客户名称" width="200" />
<el-table-column prop="CONTACT" label="联系人" width="200" />
<el-table-column prop="CONTACTPHONE" label="联系电话" width="180" />
<el-table-column prop="CUSTOMERADDRESS" label="客户地址" width="200" />
<el-table-column prop="CORP_NAME" label="运输企业" width="190" />
<el-table-column prop="CREATETIME" label="创建时间" width="200" />
<el-table-column prop="CUSTOMERNAME" label="客户名称" />
<el-table-column prop="CONTACT" label="联系人" />
<el-table-column prop="CONTACTPHONE" label="联系电话" />
<el-table-column prop="CUSTOMERADDRESS" label="客户地址" />
<el-table-column prop="CREATETIME" label="创建时间" width="150" />
<el-table-column label="操作" width="130">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/electronic_waybill_management/customer_management/edit',
query: { CUSTOMERMANAGEMENT_ID: row.CUSTOMERMANAGEMENT_ID },
})
"
>
修改
</el-button>
<el-button
text
link
@ -98,42 +88,34 @@
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import { onMounted, reactive, ref } from "vue";
import { ref } from "vue";
import {
deleteSafetyCustomerView,
getSecurityCustomerList,
} from "@/request/customer_management.js";
import { getSecurityPerson } from "@/request/waybill_registration.js";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { serialNumber } from "../../../assets/js/utils.js";
const router = useRouter();
const tableRef = ref(null);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getSecurityCustomerList);
const data = reactive({
analysisDialog: {
visible: false,
info: {},
unitsList: [],
},
});
onMounted(async () => {
await fnPerson();
});
const fnPerson = async () => {
const resData = await getSecurityPerson({});
data.unitsList = [resData.pd];
};
//
const deleteItem = async (value) => {
await ElMessageBox.confirm(`确定要删除吗?`, {
type: "warning",
});
await deleteSafetyCustomerView({ CUSTOMERMANAGEMENT_ID: value });
ElMessage.success("删除成功");
const result = await deleteSafetyCustomerView({
CUSTOMERMANAGEMENT_ID: value,
});
if (result.pd) {
ElMessage.warning("当前客户下的联系人已被运单使用,无法删除");
} else {
ElMessage.success("删除成功");
}
fnGetData();
};
</script>

View File

@ -8,22 +8,6 @@
>
<el-divider content-position="left">添加</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="地点类型" prop="LOCATIONTYPE">
<el-select
v-model="data.form.LOCATIONTYPE"
placeholder="请选择地点类型"
clearable
>
<el-option
v-for="item in LOCATIONTYPEMENU"
:key="item.id"
:label="item.id"
:value="item.name"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地点名称" prop="LOCATIONNAME">
<el-input
@ -34,10 +18,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行政区域" prop="POSSESSION">
<el-form-item label="行政区域" prop="ADMINISTRATIVEREGIONS_ID">
<layout-territory
ref="territoryCascaderRef"
v-model="data.form.ADMINISTRATIVEREGIONS"
v-model="data.form.ADMINISTRATIVEREGIONS_ID"
:level="2"
clearable
/>
@ -88,10 +72,8 @@
</template>
<script setup>
import { LOCATIONTYPEMENU } from "@/assets/js/constant";
import LayoutTerritory from "@/components/territory/index.vue";
import { getSecurityPerson } from "@/request/waybill_registration.js";
import { reactive, ref, onMounted } from "vue";
import { reactive, ref } from "vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { addSafetyLocationView } from "@/request/location_management.js";
@ -100,7 +82,7 @@ import { useRouter } from "vue-router";
const formRef = ref(null);
const rules = {
TRANSPORTATIONCOMPANY: [
CORPINFO_ID: [
{ required: true, message: "请输入运输企业名称", trigger: "blur" },
],
LOCATIONTYPE: [
@ -122,33 +104,30 @@ const rules = {
const data = reactive({
mapDialogVisible: false,
form: {
TRANSPORTATIONCOMPANY: "",
CORPINFO_ID: "",
LOCATIONTYPE: "",
LOCATIONNAME: "",
ADMINISTRATIVEREGIONS: [],
ADDRESSDETAILS: "",
LONGITUDE: "",
LATITUDE: "",
unitsList: [],
territoryCascaderRef: "",
ADMINISTRATIVEREGIONS_ID: [],
},
});
const territoryCascaderRef = ref(null);
const router = useRouter();
onMounted(async () => {
await fnPerson();
});
const fnPerson = async () => {
const resData = await getSecurityPerson({});
data.unitsList = [resData.pd];
};
const fnSubmit = async () => {
await useFormValidate(formRef);
data.form.ADMINISTRATIVEREGIONS =
territoryCascaderRef.value.getCheckedNodes();
data.form.ADMINISTRATIVEREGIONS_ID = JSON.stringify(
data.form.ADMINISTRATIVEREGIONS_ID
);
await addSafetyLocationView(data.form);
ElMessage.success("添加成功");
router.push("/electronic_waybill_management/location_managemen");
router.back();
Object.keys(data.form).forEach((key) => {
if (Array.isArray(data.form[key])) {
data.form[key] = [];

View File

@ -0,0 +1,165 @@
<template>
<layout-card>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="175px"
>
<el-divider content-position="left">添加</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="地点名称" prop="LOCATIONNAME">
<el-input
v-model="data.form.LOCATIONNAME"
placeholder="请输入地点名称"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行政区域" prop="ADMINISTRATIVEREGIONS_ARR">
<layout-territory
ref="territoryCascaderRef"
v-model="data.form.ADMINISTRATIVEREGIONS_ARR"
:level="2"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地址详情" prop="ADDRESSDETAILS">
<el-input
v-model="data.form.ADDRESSDETAILS"
placeholder="请输入地址详情"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经度/纬度" prop="LONGITUDE">
<div style="flex: 1; display: flex">
<el-input
:model-value="
(data.form.LONGITUDE ?? '') + '-' + (data.form.LATITUDE ?? '')
"
disabled
style="flex: 1"
/>
<el-button
type="primary"
class="ml-10"
@click="data.mapDialogVisible = true"
>
地图定位
</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>
<map-dialog
v-model:visible="data.mapDialogVisible"
v-model:latitude="data.form.LATITUDE"
v-model:longitude="data.form.LONGITUDE"
/>
</template>
<script setup>
import LayoutTerritory from "@/components/territory/index.vue";
import { reactive, ref } from "vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import {
getSecurityLocationView,
editSafetyLocationInfo,
} from "@/request/location_management.js";
import MapDialog from "@/views/enterprise_management/information/components/map.vue";
import { useRoute, useRouter } from "vue-router";
const formRef = ref(null);
const route = useRoute();
const LOCATIONMANAGEMENT_ID = route.query.LOCATIONMANAGEMENT_ID;
const rules = {
CORPINFO_ID: [
{ required: true, message: "请输入运输企业名称", trigger: "blur" },
],
LOCATIONTYPE: [
{ required: true, message: "请输入地点类型", trigger: "blur" },
],
LOCATIONNAME: [
{ required: true, message: "请选择地点名称", trigger: "change" },
],
ADMINISTRATIVEREGIONS_ARR: [
{ required: true, message: "请选择行政区域", trigger: "change" },
],
ADDRESSDETAILS: [
{ required: true, message: "请输入行政区域", trigger: "change" },
],
LONGITUDE: [{ required: true, message: "请选择经度", trigger: "change" }],
LATITUDE: [{ required: true, message: "请选择维度", trigger: "change" }],
};
const fnGetData = async () => {
if (!LOCATIONMANAGEMENT_ID) return;
const resData = await getSecurityLocationView({ LOCATIONMANAGEMENT_ID });
data.form = resData.pd;
data.form.ADMINISTRATIVEREGIONS_ARR =
data.form.ADMINISTRATIVEREGIONS_ID.split(",");
};
fnGetData();
const data = reactive({
mapDialogVisible: false,
form: {
CORPINFO_ID: "",
LOCATIONTYPE: "",
LOCATIONNAME: "",
ADDRESSDETAILS: "",
LONGITUDE: "",
LATITUDE: "",
territoryCascaderRef: "",
ADMINISTRATIVEREGIONS_ARR: [],
ADMINISTRATIVEREGIONS_ID: "",
ADMINISTRATIVEREGIONS: "",
},
});
const territoryCascaderRef = ref(null);
const router = useRouter();
const fnSubmit = async () => {
await useFormValidate(formRef);
data.form.ADMINISTRATIVEREGIONS_ID =
data.form.ADMINISTRATIVEREGIONS_ARR.join(",");
data.form.ADMINISTRATIVEREGIONS =
territoryCascaderRef.value.getCheckedNodes();
await editSafetyLocationInfo(data.form);
ElMessage.success("修改成功");
router.back();
Object.keys(data.form).forEach((key) => {
if (Array.isArray(data.form[key])) {
data.form[key] = [];
} else {
data.form[key] = "";
}
});
};
</script>
<style scoped lang="scss">
.flexBox {
display: flex;
align-items: flex-end;
.addBtn {
margin-left: 12px;
}
}
</style>

View File

@ -8,23 +8,12 @@
>
<el-row>
<el-col :span="6">
<el-form-item label="地点类型" prop="LOCATIONTYPE">
<el-select v-model="searchForm.LOCATIONTYPE" clearable>
<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="运输企业" prop="TRANSPORTATIONCOMPANY">
<el-select v-model="searchForm.TRANSPORTATIONCOMPANY" clearable>
<el-option
v-for="item in data.unitsList"
:key="item.CORPINFO_ID"
:label="item.CORP_NAME"
:value="item.CORP_NAME"
/>
</el-select>
<el-form-item label="地点名称" prop="LOCATIONNAME">
<el-input
v-model="searchForm.LOCATIONNAME"
placeholder="请输入地点名称"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -51,23 +40,24 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="LOCATIONTYPE" label="地点类型" width="200">
<template #default="{ row }">
{{
row.LOCATIONTYPE === "1"
? "起运地"
: row.LOCATIONTYPE === "2"
? "目的地"
: ""
}}
</template>
</el-table-column>
<el-table-column prop="LOCATIONNAME" label="地点名称" width="300" />
<el-table-column prop="ADDRESSDETAILS" label="地址详情" width="300" />
<el-table-column prop="CORP_NAME" label="运输企业" width="300" />
<el-table-column prop="CREATETIME" label="创建时间" width="250" />
<el-table-column prop="LOCATIONNAME" label="地点名称" />
<el-table-column prop="ADDRESSDETAILS" label="地址详情" />
<el-table-column prop="CREATETIME" label="创建时间" width="150" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/electronic_waybill_management/location_managemen/edit',
query: { LOCATIONMANAGEMENT_ID: row.LOCATIONMANAGEMENT_ID },
})
"
>
修改
</el-button>
<el-button
text
link
@ -98,8 +88,7 @@
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import { onMounted, reactive, ref } from "vue";
import { getSecurityPerson } from "@/request/waybill_registration.js";
import { ref } from "vue";
import {
deleteSafetyLocationView,
getSecurityLocationList,
@ -111,27 +100,20 @@ const router = useRouter();
const tableRef = ref(null);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getSecurityLocationList);
const data = reactive({
analysisDialog: {
visible: false,
info: {},
unitsList: [],
},
});
onMounted(async () => {
await fnPerson();
});
const fnPerson = async () => {
const resData = await getSecurityPerson({});
data.unitsList = [resData.pd];
};
//
const deleteItem = async (value) => {
await ElMessageBox.confirm(`确定要删除吗?`, {
type: "warning",
});
await deleteSafetyLocationView({ LOCATIONMANAGEMENT_ID: value });
ElMessage.success("删除成功");
const result = await deleteSafetyLocationView({
LOCATIONMANAGEMENT_ID: value,
});
if (result.pd) {
ElMessage.warning("此地点已被运单使用,无法删除");
} else {
ElMessage.success("删除成功");
}
fnGetData();
};
</script>

View File

@ -18,8 +18,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调度人" prop="USER_IDS">
<el-select v-model="data.form.USER_IDS" multiple>
<el-form-item label="调度人" prop="DISPATCHER">
<el-select v-model="data.form.DISPATCHER" multiple>
<el-option
v-for="item in data.userList"
:key="item.USER_ID"
@ -233,6 +233,7 @@
<el-input
v-model="data.form.STARTADMINISTRATIVEAREA"
placeholder="请输入行政区域"
disabled
clearable
/>
</el-form-item>
@ -276,6 +277,7 @@
<el-input
v-model="data.form.ENDDMINISTRATIVEAREA"
placeholder="请输入行政区域"
disabled
clearable
/>
</el-form-item>
@ -291,7 +293,6 @@
<script setup>
import {
addSafetyWaybillreView,
getSecurityPerson,
getUserPersonTypeListAll,
} from "@/request/waybill_registration.js";
import { onMounted, reactive, ref, watchEffect } from "vue";
@ -299,15 +300,51 @@ import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import LayoutDepartment from "@/components/department/index.vue";
import { getPostListAll, getUserListAll } from "@/request/data_dictionary.js";
import { getSecurityCustomerList } from "@/request/customer_management.js";
import { getSecurityLocationList } from "@/request/location_management.js";
import { getTrafficCustomerSelectList } from "@/request/customer_management.js";
import { getTrafficLocationSelectList } from "@/request/location_management.js";
import { getOperationVehicleList } from "@/request/operation_vehicle.js";
import { useRouter } from "vue-router";
import { getFreightTrailerList } from "@/request/enterprise_management.js";
const formRef = ref(null);
const confirmed = (rule, client, callback) => {
if (client) {
if (client === data.form.CONFIRMER) {
callback(new Error("客户名称已被确认方选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const client = (rule, confirmed, callback) => {
if (confirmed) {
if (confirmed === data.form.CLIENT) {
callback(new Error("客户名称已被委托方选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const bourn = (rule, origin, callback) => {
if (origin) {
if (origin === data.form.DESTINATION) {
callback(new Error("地点已被目的地选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const origin = (rule, bourn, callback) => {
if (bourn) {
if (bourn === data.form.ORIGIN) {
callback(new Error("地点已被起运地选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const rules = {
TRANSPORTATIONCOMPANY: [
CORPINFO_ID: [
{ required: true, message: "请输入运输企业名称", trigger: "blur" },
],
DISPATCHER: [
@ -318,7 +355,7 @@ const rules = {
],
WAYBILLNUMBER: [
{ required: true, message: "请输入运单编号", trigger: "blur" },
{ min: 7, message: "运单编号不能少于7位", trigger: "blur" },
/* { min: 7, message: "7", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (!/^[A-Za-z0-9]+$/.test(value)) {
@ -328,12 +365,15 @@ const rules = {
}
},
trigger: "blur",
},
}, */
],
TRANSPORTVEHICLE: [
{ required: true, message: "请选择运营车辆", trigger: "change" },
],
CLIENT: [{ required: true, message: "请选择委托方名称", trigger: "change" }],
CLIENT: [
{ required: true, message: "请选择委托方名称", trigger: "change" },
{ validator: confirmed, trigger: "change" },
],
CLIENTCONTACTPERSON: [
{ required: true, message: "请输入联系人姓名", trigger: "blur" },
],
@ -347,25 +387,33 @@ const rules = {
],
CONFIRMER: [
{ required: true, message: "请选择确认方名称", trigger: "change" },
{ validator: client, trigger: "change" },
],
CONFIRMINGPERSON: [
{ required: true, message: "请选择确认方联系人", trigger: "change" },
],
ORIGIN: [{ required: true, message: "请选择起运地点", trigger: "change" }],
ORIGIN: [
{ required: true, message: "请选择起运地点", trigger: "change" },
{ validator: bourn, trigger: "change" },
],
SHIPPINGADDRESS: [
{ required: true, message: "请输入起运地址", trigger: "blur" },
],
DESTINATION: [
{ required: true, message: "请选择目的地点", trigger: "change" },
{ validator: origin, trigger: "change" },
],
DESTINATIONADDRESS: [
{ required: true, message: "请输入目的地址", trigger: "blur" },
],
PRACTITIONER: [
{ required: true, message: "请选择从业人员", trigger: "change" },
],
};
const data = reactive({
form: {
TRANSPORTATIONCOMPANY: "",
CORPINFO_ID: "",
DISPATCHER: "",
DEPARTMENT_ID: "",
POST_ID: "",
@ -496,90 +544,83 @@ const fnTruck = async () => {
};
const fnCustomerType = async () => {
const res = await getSecurityCustomerList();
const res = await getTrafficCustomerSelectList();
const varList = res.varList;
const clientMap = new Map();
varList.forEach((item) => {
if (item.CUSTOMERTYPE === "1") {
if (!clientMap.has(item.CUSTOMERNAME)) {
clientMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
// CUSTOMERNAME
clientMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
if (!clientMap.has(item.CUSTOMERNAME)) {
clientMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
});
varList.forEach((item) => {
// CUSTOMERNAME
clientMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
});
});
data.clientOptionsList = [...clientMap.values()];
const confirmerMap = new Map();
varList.forEach((item) => {
if (item.CUSTOMERTYPE === "2") {
if (!confirmerMap.has(item.CUSTOMERNAME)) {
confirmerMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
// CUSTOMERNAME
confirmerMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
if (!confirmerMap.has(item.CUSTOMERNAME)) {
confirmerMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
// CUSTOMERNAME
confirmerMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
});
});
data.confirmerOptionsList = [...confirmerMap.values()];
};
const fnLocation = async () => {
const res = await getSecurityLocationList();
const res = await getTrafficLocationSelectList();
const varList = res.varList || [];
const StartOptionstMap = new Map();
varList.forEach((item) => {
if (item.LOCATIONTYPE === "1") {
if (!StartOptionstMap.has(item.LOCATIONNAME)) {
StartOptionstMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
StartOptionstMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
if (!StartOptionstMap.has(item.LOCATIONNAME)) {
StartOptionstMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
StartOptionstMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
});
});
data.StartOptionsList = [...StartOptionstMap.values()];
const EndOptionsMap = new Map();
varList.forEach((item) => {
if (item.LOCATIONTYPE === "2") {
if (!EndOptionsMap.has(item.LOCATIONNAME)) {
EndOptionsMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
EndOptionsMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
if (!EndOptionsMap.has(item.LOCATIONNAME)) {
EndOptionsMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
EndOptionsMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
});
});
data.EndOptionsList = [...EndOptionsMap.values()];
};
@ -625,28 +666,21 @@ watchEffect(() => {
});
onMounted(async () => {
await fnPerson();
await fnCustomerType();
await fnLocation();
await fnVehicle();
await fnTruck();
});
const fnPerson = async () => {
const resData = await getSecurityPerson({});
data.unitsList = [resData.pd];
};
const fnSubmit = async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
await addSafetyWaybillreView(formData);
ElMessage.success("添加成功");
await router.push("/electronic_waybill_management/waybill_registration");
router.back();
Object.keys(data.form).forEach((key) => {
if (Array.isArray(data.form[key])) {
data.form[key] = [];

View File

@ -0,0 +1,710 @@
<template>
<layout-card>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="175px"
>
<!-- 承运信息 -->
<el-divider content-position="left">承运信息</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item prop="DEPARTMENT_ID" label="部门">
<layout-department
v-model="data.form.DEPARTMENT_ID"
@update:model-value="fnDepartmentChange"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调度人" prop="DISPATCHER">
<el-select v-model="data.form.DISPATCHER" multiple>
<el-option
v-for="item in data.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运单编号" prop="WAYBILLNUMBER">
<el-input
v-model="data.form.WAYBILLNUMBER"
placeholder="请输入运单编号"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="承运日期" prop="SHIPPINGDATE">
<el-date-picker
v-model="data.form.SHIPPINGDATE"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="选择时间"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运输车辆" prop="TRANSPORTVEHICLE">
<el-select
v-model="data.form.TRANSPORTVEHICLE"
placeholder="请选择运输车辆"
clearable
>
<el-option
v-for="item in data.OperationVehicle"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="从业人员" prop="PRACTITIONER">
<el-select
v-model="data.form.PRACTITIONER"
placeholder="请选择从业人员"
clearable
>
<el-option
v-for="item in data.userTypeList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="货运挂车" prop="TRUCKCART">
<el-select
v-model="data.form.TRUCKCART"
placeholder="请选择货运挂车"
clearable
>
<el-option
v-for="item in data.OperationTruck"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 客户信息 -->
<el-divider content-position="left">客户信息</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="委托方" prop="CLIENT">
<el-select
v-model="data.form.CLIENT"
placeholder="请选择委托方"
@update:model-value="fnClientChange"
>
<el-option
v-for="item in data.clientOptionsList"
:key="item.CUSTOMERNAME_ID"
:label="item.CUSTOMERNAME"
:value="item.CUSTOMERNAME_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系人" prop="ENTRUST_PERSON">
<el-select
v-model="data.form.ENTRUST_PERSON"
placeholder="请选择委联系人"
clearable
@change="changeCLIENTCONTACTPERSON"
>
<el-option
v-for="contact in data.clientOptions"
:key="contact.CONTACT_ID"
:label="contact.CONTACT"
:value="contact.CONTACT_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="CLIENTCONTACTPHONE">
<el-input
v-model="data.form.CLIENTCONTACTPHONE"
placeholder="请输入联系电话"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="确认方" prop="CONFIRMER">
<el-select
v-model="data.form.CONFIRMER"
placeholder="请选择确认方"
clearable
@update:model-value="fnConfirmerChange"
>
<el-option
v-for="item in data.confirmerOptionsList"
:key="item.CUSTOMERNAME_ID"
:label="item.CUSTOMERNAME"
:value="item.CUSTOMERNAME_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系人" prop="CONFIRM_PERSON">
<el-select
v-model="data.form.CONFIRM_PERSON"
placeholder="请选择确认方联系人"
clearable
@change="changeCONFIRMINGPERSON"
>
<el-option
v-for="contact in data.confirmerOptions"
:key="contact.CONTACT_ID"
:label="contact.CONTACT"
:value="contact.CONTACT_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="CONFIRMINGPHONE">
<el-input
v-model="data.form.CONFIRMINGPHONE"
placeholder="请输入联系电话"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<!-- 地点信息 -->
<el-divider content-position="left">地点信息</el-divider>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="起运地点" prop="ORIGIN">
<el-select
v-model="data.form.ORIGIN"
placeholder="请选择起运地点"
clearable
@update:model-value="fnShipmentAddrChange"
>
<el-option
v-for="item in data.StartOptionsList"
:key="item.LOCATIONNAME_ID"
:label="item.LOCATIONNAME"
:value="item.LOCATIONNAME_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="起运地址" prop="SHIPPINGADDRESS">
<el-select
v-model="data.form.SHIPPINGADDRESS"
placeholder="请选择起运地址"
clearable
@change="changeSHIPPINGADDRESS"
>
<el-option
v-for="item in data.StartOptions"
:key="item.ADDRESSDETAILS_ID"
:label="item.ADDRESSDETAILS"
:value="item.ADDRESSDETAILS_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行政区域" prop="STARTADMINISTRATIVEAREA">
<el-input
v-model="data.form.STARTADMINISTRATIVEAREA"
placeholder="请输入行政区域"
disabled
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="目的地点" prop="DESTINATION">
<el-select
v-model="data.form.DESTINATION"
placeholder="请选择目的地点"
clearable
@update:model-value="fnGogalAddrChange"
>
<el-option
v-for="item in data.EndOptionsList"
:key="item.LOCATIONNAME_ID"
:label="item.LOCATIONNAME"
:value="item.LOCATIONNAME_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="目的地址" prop="DESTINATIONADDRESS">
<el-select
v-model="data.form.DESTINATIONADDRESS"
placeholder="请选择起运地址"
clearable
@change="changeDESTINATIONADDRESS"
>
<el-option
v-for="item in data.EndOptions"
:key="item.ADDRESSDETAILS_ID"
:label="item.ADDRESSDETAILS"
:value="item.ADDRESSDETAILS_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行政区域" prop="ENDDMINISTRATIVEAREA">
<el-input
v-model="data.form.ENDDMINISTRATIVEAREA"
placeholder="请输入行政区域"
disabled
clearable
/>
</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 {
getSafetyWaybillreInfo,
editSafetyWaybillreInfo,
getUserPersonTypeListAll,
} from "@/request/waybill_registration.js";
import { onMounted, reactive, ref, watchEffect } from "vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import LayoutDepartment from "@/components/department/index.vue";
import { getUserListAll } from "@/request/data_dictionary.js";
import { getTrafficCustomerSelectList } from "@/request/customer_management.js";
import { getTrafficLocationSelectList } from "@/request/location_management.js";
import { getOperationVehicleList } from "@/request/operation_vehicle.js";
import { useRoute, useRouter } from "vue-router";
import { getFreightTrailerList } from "@/request/enterprise_management.js";
const formRef = ref(null);
const route = useRoute();
const WAYBILLREGISTRATION_ID = route.query.WAYBILLREGISTRATION_ID;
const confirmed = (rule, client, callback) => {
if (client) {
if (client === data.form.CONFIRMER) {
callback(new Error("客户名称已被确认方选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const client = (rule, confirmed, callback) => {
if (confirmed) {
if (confirmed === data.form.CLIENT) {
callback(new Error("客户名称已被委托方选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const bourn = (rule, origin, callback) => {
if (origin) {
if (origin === data.form.DESTINATION) {
callback(new Error("地点已被目的地选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const origin = (rule, bourn, callback) => {
if (bourn) {
if (bourn === data.form.ORIGIN) {
callback(new Error("地点已被起运地选中,请重新选择"));
} else callback();
} else {
callback();
}
};
const rules = {
CORPINFO_ID: [
{ required: true, message: "请输入运输企业名称", trigger: "blur" },
],
DISPATCHER: [
{ required: true, message: "请输入调度人姓名", trigger: "blur" },
],
SHIPPINGDATE: [
{ required: true, message: "请选择承运日期", trigger: "change" },
],
WAYBILLNUMBER: [
{ required: true, message: "请输入运单编号", trigger: "blur" },
/* { min: 7, message: "7", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (!/^[A-Za-z0-9]+$/.test(value)) {
callback(new Error("运单编号只能包含大小写英文字符和数字"));
} else {
callback();
}
},
trigger: "blur",
}, */
],
TRANSPORTVEHICLE: [
{ required: true, message: "请选择运营车辆", trigger: "change" },
],
CLIENT: [
{ required: true, message: "请选择委托方名称", trigger: "change" },
{ validator: confirmed, trigger: "change" },
],
CLIENTCONTACTPERSON: [
{ required: true, message: "请输入联系人姓名", trigger: "blur" },
],
CLIENTCONTACTPHONE: [
{ required: true, message: "请输入联系电话", trigger: "blur" },
{ min: 11, message: "号码格式错误", trigger: "blur" },
],
CONFIRMINGPHONE: [
{ required: true, message: "请输入联系电话", trigger: "blur" },
{ min: 11, message: "号码格式错误", trigger: "blur" },
],
CONFIRMER: [
{ required: true, message: "请选择确认方名称", trigger: "change" },
{ validator: client, trigger: "change" },
],
CONFIRMINGPERSON: [
{ required: true, message: "请选择确认方联系人", trigger: "change" },
],
ORIGIN: [
{ required: true, message: "请选择起运地点", trigger: "change" },
{ validator: bourn, trigger: "change" },
],
SHIPPINGADDRESS: [
{ required: true, message: "请输入起运地址", trigger: "blur" },
],
DESTINATION: [
{ required: true, message: "请选择目的地点", trigger: "change" },
{ validator: origin, trigger: "change" },
],
DESTINATIONADDRESS: [
{ required: true, message: "请输入目的地址", trigger: "blur" },
],
PRACTITIONER: [
{ required: true, message: "请选择从业人员", trigger: "change" },
],
};
const data = reactive({
form: {
CORPINFO_ID: "",
DISPATCHER: [],
DEPARTMENT_ID: "",
POST_ID: "",
USER_ID: "",
SHIPPINGDATE: "",
IDENTITYID: "",
TRUCKCART: "",
EMPLOYEEPHONE: "",
PRACTITIONER: "",
TRANSPORTVEHICLE: "",
CLIENT: "",
CLIENTCONTACTPERSON: "",
CLIENTCONTACTPHONE: "",
CONFIRMER: "",
CONFIRMINGPERSON: "",
CONFIRMINGPHONE: "",
ORIGIN: "",
SHIPPINGADDRESS: "",
STARTADMINISTRATIVEAREA: "",
DESTINATION: "",
DESTINATIONADDRESS: "",
ENDDMINISTRATIVEAREA: "",
WAYBILLNUMBER: "",
},
clientOptions: [], //
confirmerOptions: [], //
StartOptions: [], //
EndOptions: [], //
OperationVehicle: [], //
StartOptionsList: [],
EndOptionsList: [],
clientOptionsList: [],
confirmerOptionsList: [],
USER: [],
});
const router = useRouter();
const fnGetData = async () => {
if (!WAYBILLREGISTRATION_ID) return;
const resData = await getSafetyWaybillreInfo({ WAYBILLREGISTRATION_ID });
data.form = resData.pd;
data.form.DISPATCHER = data.form.DISPATCHER.split(",");
data.form.SHIPPINGADDRESS = data.form.SHIPPING_ADDR; //
data.form.DESTINATIONADDRESS = data.form.DESTINATION_ADDR; //
data.userList = data.form.deptList; //
data.form.CLIENTCONTACTPHONE = data.form.ENTRUST_PHONE;
data.form.CONFIRMINGPHONE = data.form.CONFIRM_PHONE;
data.form.STARTADMINISTRATIVEAREA = data.form.DEPARTURE_ADDR;
data.form.ENDDMINISTRATIVEAREA = data.form.GOAL_ADDR;
};
fnGetData();
const fnClientChange = () => {
data.form.ENTRUST_PERSON = "";
data.form.CLIENTCONTACTPHONE = "";
};
const fnConfirmerChange = () => {
data.form.CONFIRM_PERSON = "";
data.form.CONFIRMINGPHONE = "";
};
const fnShipmentAddrChange = () => {
data.form.SHIPPINGADDRESS = "";
data.form.STARTADMINISTRATIVEAREA = "";
};
const fnGogalAddrChange = () => {
data.form.DESTINATIONADDRESS = "";
data.form.ENDDMINISTRATIVEAREA = "";
};
const fnClientUserChange = async () => {
const selectedClient = data.clientOptionsList.find(
(item) => item.CUSTOMERNAME_ID === data.form.CLIENT
);
data.clientOptions = selectedClient ? selectedClient.CONTACTS : [];
};
const fnClientConfirmedChange = async () => {
const selectedClient = data.confirmerOptionsList.find(
(item) => item.CUSTOMERNAME_ID === data.form.CONFIRMER
);
data.confirmerOptions = selectedClient ? selectedClient.CONTACTS : [];
};
const fnClientShipmentAddr = async () => {
const selectedLocation = data.StartOptionsList.find(
(location) => location.LOCATIONNAME_ID === data.form.ORIGIN
);
//
data.StartOptions = selectedLocation ? selectedLocation.LOCATION : [];
};
const fnGoalAddrChange = async () => {
const selectedDestination = data.EndOptionsList.find(
(location) => location.LOCATIONNAME_ID === data.form.DESTINATION
);
//
data.EndOptions = selectedDestination ? selectedDestination.LOCATION : [];
};
const changeCLIENTCONTACTPERSON = (contactPersonId) => {
const selectedContact = data.clientOptions.find(
(item) => item.CONTACT_ID === contactPersonId
);
data.form.CLIENTCONTACTPHONE = selectedContact
? selectedContact.CONTACTPHONE
: "";
};
const changeCONFIRMINGPERSON = (contactPersonId) => {
//
const selectedContact = data.confirmerOptions.find(
(item) => item.CONTACT_ID === contactPersonId
);
//
data.form.CONFIRMINGPHONE = selectedContact
? selectedContact.CONTACTPHONE
: "";
};
const fnGetUnitsList = async () => {
const resData = await getUserPersonTypeListAll({});
data.userTypeList = resData.userList;
};
fnGetUnitsList();
const fnVehicle = async () => {
const res = await getOperationVehicleList();
const varList = res.varList || [];
data.OperationVehicle = varList.map((item) => item.PLATE_NUMBER);
};
const fnTruck = async () => {
const res = await getFreightTrailerList();
const varList = res.varList || [];
data.OperationTruck = varList.map((item) => item.PLATE_NUMBER);
};
const fnCustomerType = async () => {
const res = await getTrafficCustomerSelectList();
const varList = res.varList;
const clientMap = new Map();
varList.forEach((item) => {
if (!clientMap.has(item.CUSTOMERNAME)) {
clientMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
// CUSTOMERNAME
clientMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
});
});
data.clientOptionsList = [...clientMap.values()];
const confirmerMap = new Map();
varList.forEach((item) => {
if (!confirmerMap.has(item.CUSTOMERNAME)) {
confirmerMap.set(item.CUSTOMERNAME, {
CUSTOMERNAME: item.CUSTOMERNAME,
CUSTOMERNAME_ID: item.CUSTOMERNAME_ID,
CONTACTS: [],
});
}
// CUSTOMERNAME
confirmerMap.get(item.CUSTOMERNAME).CONTACTS.push({
CONTACT: item.CONTACT,
CONTACT_ID: item.CONTACT_ID,
CONTACTPHONE: item.CONTACTPHONE,
});
});
data.confirmerOptionsList = [...confirmerMap.values()];
};
fnCustomerType();
const fnLocation = async () => {
const res = await getTrafficLocationSelectList();
const varList = res.varList || [];
const StartOptionstMap = new Map();
varList.forEach((item) => {
if (!StartOptionstMap.has(item.LOCATIONNAME)) {
StartOptionstMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
StartOptionstMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
});
});
data.StartOptionsList = [...StartOptionstMap.values()];
const EndOptionsMap = new Map();
varList.forEach((item) => {
if (!EndOptionsMap.has(item.LOCATIONNAME)) {
EndOptionsMap.set(item.LOCATIONNAME, {
LOCATIONNAME: item.LOCATIONNAME,
LOCATIONNAME_ID: item.LOCATIONNAME_ID,
LOCATION: [],
});
}
// CUSTOMERNAME
EndOptionsMap.get(item.LOCATIONNAME).LOCATION.push({
ADDRESSDETAILS: item.ADDRESSDETAILS,
ADDRESSDETAILS_ID: item.ADDRESSDETAILS_ID,
ADMINISTRATIVEREGIONS: item.ADMINISTRATIVEREGIONS,
});
});
data.EndOptionsList = [...EndOptionsMap.values()];
};
const changeSHIPPINGADDRESS = (addressDetailsId) => {
//
const matchingAddress = data.StartOptionsList.flatMap(
(item) => item.LOCATION
).find((address) => address.ADDRESSDETAILS_ID === addressDetailsId);
//
data.form.STARTADMINISTRATIVEAREA = matchingAddress
? matchingAddress.ADMINISTRATIVEREGIONS
: "";
};
const changeDESTINATIONADDRESS = (destinationAddressId) => {
//
const matchingAddress = data.EndOptionsList.flatMap(
(item) => item.LOCATION
).find((address) => address.ADDRESSDETAILS_ID === destinationAddressId);
//
data.form.ENDDMINISTRATIVEAREA = matchingAddress
? matchingAddress.ADMINISTRATIVEREGIONS
: "";
};
const fnDepartmentChange = async () => {
data.userList = [];
data.form.USER_ID = "";
data.form.DISPATCHER = "";
await fnGetUser(data.form.DEPARTMENT_ID);
};
const fnGetUser = async (DEPARTMENT_ID) => {
const resData = await getUserListAll({ DEPARTMENT_ID });
data.userList = resData.userList;
};
watchEffect(() => {
if (data.form.CLIENT) fnClientUserChange();
if (data.form.CONFIRMER) fnClientConfirmedChange();
if (data.form.ORIGIN) fnClientShipmentAddr();
if (data.form.DESTINATION) fnGoalAddrChange();
});
onMounted(async () => {
await fnCustomerType();
await fnLocation();
await fnVehicle();
await fnTruck();
});
const fnSubmit = async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
await editSafetyWaybillreInfo(formData);
ElMessage.success("修改成功");
router.back();
};
</script>
<style scoped lang="scss">
.flexBox {
display: flex;
align-items: flex-end;
.addBtn {
margin-left: 12px;
}
}
</style>

View File

@ -9,7 +9,11 @@
<el-row>
<el-col :span="6">
<el-form-item label="车辆车牌" prop="TRANSPORTVEHICLE">
<el-input v-model="searchForm.TRANSPORTVEHICLE" clearable />
<el-input
v-model="searchForm.TRANSPORTVEHICLE"
placeholder="请输入车牌号"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -45,32 +49,57 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="WAYBILLNUMBER" label="运单编号" width="150" />
<el-table-column prop="WAYBILLSTATUS" label="运单状态" width="150">
<el-table-column prop="WAYBILLNUMBER" label="运单编号" />
<el-table-column prop="WAYBILLSTATUS" label="运单状态" width="80">
<template #default="{ row }">
<el-tag v-if="row.WAYBILLSTATUS === '0'"></el-tag>
<el-tag v-if="row.WAYBILLSTATUS === '0' || row.WAYBILLSTATUS === '3'"></el-tag>
<el-tag v-else-if="row.WAYBILLSTATUS === '1'">已出发</el-tag>
<el-tag v-else-if="row.WAYBILLSTATUS === '2'">收车后</el-tag>
</template>
</el-table-column>
<el-table-column prop="TRANSPORTVEHICLE" label="运输车辆" width="150" />
<el-table-column prop="NAME" label="从业人员" width="150" />
<el-table-column prop="CLIENT_NAME" label="委托方" width="150">
<el-table-column prop="TRANSPORTVEHICLE" label="运输车辆" width="80" />
<el-table-column prop="NAME" label="从业人员" width="70" />
<el-table-column prop="CLIENT_NAME" label="委托方"> </el-table-column>
<el-table-column prop="CONFIRMER_NAME" label="确认方">
</el-table-column>
<el-table-column prop="CONFIRMER_NAME" label="确认方" width="150">
</el-table-column>
<el-table-column prop="ORIGIN_NAME" label="起运地" width="150">
</el-table-column>
<el-table-column prop="DESTINATION_NAME" label="目的地" width="150">
<el-table-column prop="ORIGIN_NAME" label="起运地"> </el-table-column>
<el-table-column prop="DESTINATION_NAME" label="目的地">
</el-table-column>
<el-table-column prop="SHIPPINGDATE" label="承运日期" width="180">
</el-table-column>
<el-table-column label="操作" width="120">
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/electronic_waybill_management/waybill_registration/view',
query: { WAYBILLREGISTRATION_ID: row.WAYBILLREGISTRATION_ID },
})
"
>
查看
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/electronic_waybill_management/waybill_registration/edit',
query: { WAYBILLREGISTRATION_ID: row.WAYBILLREGISTRATION_ID },
})
"
>
修改
</el-button>
<el-button
v-if="row.WAYBILLSTATUS !== '1'"
type="danger"
text
link
@click="deleteItem(row.WAYBILLREGISTRATION_ID)"
>
删除
@ -88,13 +117,6 @@
>
添加
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnBatchDelete"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
@ -107,25 +129,16 @@ import useListData from "@/assets/js/useListData.js";
import { onMounted, ref } from "vue";
import { layoutFnGetNotificationsClassification } from "@/request/safety_production_related.js";
import {
dateteSecurityAllWaybillre,
deleteSafetyWaybillreView,
getSecurityWaybillreList,
} from "@/request/waybill_registration.js";
import { ElMessageBox, ElMessage } from "element-plus";
import { debounce } from "throttle-debounce";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { useRouter } from "vue-router";
const router = useRouter();
const buttonJurisdiction = await useButtonJurisdiction("riskunit");
const tableRef = ref(null);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getSecurityWaybillreList);
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
//
const deleteItem = async (value) => {
await ElMessageBox.confirm(`确定要删除吗?`, {
@ -135,25 +148,6 @@ const deleteItem = async (value) => {
ElMessage.success("删除成功");
fnGetData();
};
const fnBatchDelete = debounce(
1000,
async () => {
// eslint-disable-next-line no-undef
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
await ElMessageBox.confirm("确定要删除选中的数据吗?", { type: "warning" });
const DATA_IDS = selectionData
.map((item) => item.WAYBILLREGISTRATION_ID)
.join(",");
await dateteSecurityAllWaybillre({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const relatedClassificationList = ref(null);
onMounted(async () => {

View File

@ -0,0 +1,96 @@
<template>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<el-divider content-position="left">承运信息</el-divider>
<el-descriptions border>
<el-descriptions-item label="部门">
{{ data.info.DEPARTMENTNAME }}
</el-descriptions-item>
<el-descriptions-item label="调度人">
{{ data.nameList.join() }}
</el-descriptions-item>
<el-descriptions-item label="运单编号">
{{ data.info.WAYBILLNUMBER }}
</el-descriptions-item>
<el-descriptions-item label="承运日期">
{{ data.info.SHIPPINGDATE }}
</el-descriptions-item>
<el-descriptions-item label="运输车辆">
{{ data.info.TRANSPORTVEHICLE }}
</el-descriptions-item>
<el-descriptions-item label="从业人员">
{{ data.info.NAME }}
</el-descriptions-item>
<el-descriptions-item label="货运挂车">
{{ data.info.TRUCKCART }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">客户信息</el-divider>
<el-descriptions border>
<el-descriptions-item label="委托方">
{{ data.info.CLIENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="联系人">
{{ data.info.ENTRUSTPERSON }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{ data.info.ENTRUST_PHONE }}
</el-descriptions-item>
<el-descriptions-item label="确认方">
{{ data.info.CONFIRMER_NAME }}
</el-descriptions-item>
<el-descriptions-item label="联系人">
{{ data.info.CONFIRMPERSON }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{ data.info.CONFIRM_PHONE }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">地点信息</el-divider>
<el-descriptions border>
<el-descriptions-item label="起运地点">
{{ data.info.ORIGIN_NAME }}
</el-descriptions-item>
<el-descriptions-item label="起运地址">
{{ data.info.SHIPPING_ADDR}}
</el-descriptions-item>
<el-descriptions-item label="行政区域">
{{ data.info.DEPARTURE_ADDR }}
</el-descriptions-item>
<el-descriptions-item label="目的地点">
{{ data.info.DESTINATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="目的地址">
{{ data.info.DESTINATION_ADDR }}
</el-descriptions-item>
<el-descriptions-item label="行政区域">
{{ data.info.GOAL_ADDR }}
</el-descriptions-item>
</el-descriptions>
</table>
</div>
</layout-card>
</template>
<script setup>
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getSafetyWaybillreInfo } from "@/request/waybill_registration.js";
const route = useRoute();
const { WAYBILLREGISTRATION_ID } = route.query;
const data = reactive({
info: {},
nameList: [],
});
const fnGetData = async () => {
const resData = await getSafetyWaybillreInfo({ WAYBILLREGISTRATION_ID });
data.info = resData.pd;
resData.pd.names.forEach((item) => {
data.nameList.push(item.NAME);
});
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,77 @@
<template>
<layout-card>
<el-tabs v-model="activeName" @tab-change="fnTabChange">
<el-tab-pane
v-for="item in tabsList"
:key="item.name"
:disabled="!EMERGENCYDRILLBASIC_ID"
lazy
:label="item.label"
:name="item.name"
>
<component
:is="item.component"
:emergency-drill-basic-id="EMERGENCYDRILLBASIC_ID"
:active-name="activeName"
/>
</el-tab-pane>
</el-tabs>
</layout-card>
</template>
<script setup>
import { useRoute, useRouter, onBeforeRouteUpdate } from "vue-router";
import { ref, markRaw } from "vue";
import EssentialInformation from "./components/essentialInformation.vue";
import CommandingOrganization from "./components/commanding_organization/index.vue";
import ExerciseContentAndScenario from "./components/exercise_content_scenario/index.vue";
import SummaryEvaluation from "./components/summary_evaluation.vue";
import SchemeText from "./components/scheme_text.vue";
const route = useRoute();
const router = useRouter();
const activeName = ref(route.query.activeName || "essentialInformation");
const EMERGENCYDRILLBASIC_ID = ref(route.query.EMERGENCYDRILLBASIC_ID);
const tabsList = ref([
{
label: "应急方案基本信息",
name: "essentialInformation",
component: markRaw(EssentialInformation),
},
{
label: "应急指挥机构",
name: "commandingOrganization",
component: markRaw(CommandingOrganization),
},
{
label: "演练内容及场景",
name: "exerciseContentAndScenario",
component: markRaw(ExerciseContentAndScenario),
},
{
label: "总结评估",
name: "summaryEvaluation",
component: markRaw(SummaryEvaluation),
},
{
label: "应急演练方案文本",
name: "schemeText",
component: markRaw(SchemeText),
},
]);
const fnTabChange = (event) => {
router.replace({
path: route.path,
query: {
activeName: event,
EMERGENCYDRILLBASIC_ID: EMERGENCYDRILLBASIC_ID.value,
},
});
};
onBeforeRouteUpdate((to) => {
activeName.value = to.query.activeName;
EMERGENCYDRILLBASIC_ID.value = to.query.EMERGENCYDRILLBASIC_ID;
});
</script>
<style scoped></style>

View File

@ -0,0 +1,57 @@
<template>
<el-row :gutter="24" class="pb-20">
<el-col :span="12" style="border-right: 1px dashed var(--el-border-color)">
<mechanism :emergency-drill-basic-id="emergencyDrillBasicId" />
</el-col>
<el-col :span="12">
<personnel :emergency-drill-basic-id="emergencyDrillBasicId" />
</el-col>
</el-row>
<div class="tc pt-20" style="border-top: 1px dashed var(--el-border-color)">
<el-button
@click="
router.replace({
path: route.path,
query: {
activeName: 'essentialInformation',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
上一步
</el-button>
<el-button
type="primary"
@click="
router.replace({
path: route.path,
query: {
activeName: 'exerciseContentAndScenario',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
下一步
</el-button>
</div>
</template>
<script setup>
import Mechanism from "./mechanism.vue";
import Personnel from "./personnel.vue";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
</script>
<style scoped></style>

View File

@ -0,0 +1,154 @@
<template>
<el-form
:model="searchForm"
label-width="80px"
@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="8">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYDRILLORG_ID"
:data="list"
@get-data="fnGetData"
>
<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="ORG_NAME" label="机构名称" />
<el-table-column prop="ORG_UNIT_IDS" label="组成单位" />
<el-table-column prop="ORG_DUTY" label="机构职责" />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnAddOrEdit(row.EMERGENCYDRILLORG_ID, 'edit')"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="fnDelete(row.EMERGENCYDRILLORG_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAddOrEdit('', 'add')">
新增
</el-button>
<el-button type="danger" @click="fnDeleteAll"> </el-button>
</template>
</layout-table>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:emergency-drill-basic-id="emergencyDrillBasicId"
@get-data="fnResetPagination"
/>
</template>
<script setup>
import { nextTick, reactive } from "vue";
import {
getEmergencyDrillManagementMechanismList,
getEmergencyDrillManagementMechanismView,
setEmergencyDrillManagementMechanismDelete,
setEmergencyDrillManagementMechanismDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import { serialNumber } from "@/assets/js/utils.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useListData from "@/assets/js/useListData.js";
import Add from "./mechanism_add.vue";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const { list, searchForm, pagination, fnResetPagination, fnGetData, tableRef } =
useListData(getEmergencyDrillManagementMechanismList, {
otherParams: {
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
},
});
const data = reactive({
addOrEditDialog: {
visible: false,
type: "",
form: {
ORG_NAME: "",
ORG_UNIT_IDS: "",
ORG_DUTY: "",
},
},
});
const fnDelete = debounce(
1000,
async (EMERGENCYDRILLORG_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementMechanismDelete({ EMERGENCYDRILLORG_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYDRILLORG_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementMechanismDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnAddOrEdit = async (EMERGENCYDRILLORG_ID, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
if (type === "edit") {
const resData = await getEmergencyDrillManagementMechanismView({
EMERGENCYDRILLORG_ID,
});
data.addOrEditDialog.form = resData.pd;
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,91 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
@close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="机构名称" prop="ORG_NAME">
<el-input v-model="form.ORG_NAME" />
</el-form-item>
<el-form-item label="组成单位" prop="ORG_UNIT_IDS">
<el-input v-model="form.ORG_UNIT_IDS" />
</el-form-item>
<el-form-item label="机构职责" prop="ORG_DUTY">
<el-input v-model="form.ORG_DUTY" :rows="3" type="textarea" />
</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 { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
setEmergencyDrillManagementMechanismAdd,
setEmergencyDrillManagementMechanismEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
default: false,
required: true,
},
form: {
type: Object,
default: () => ({}),
required: true,
},
type: {
type: String,
default: "add",
required: true,
},
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
ORG_NAME: [{ required: true, message: "机构名称不能为空", trigger: "blur" }],
ORG_UNIT_IDS: [
{ required: true, message: "组成单位不能为空", trigger: "blur" },
],
ORG_DUTY: [{ required: true, message: "机构职责不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = {
...form.value,
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
};
props.type === "add"
? await setEmergencyDrillManagementMechanismAdd(params)
: await setEmergencyDrillManagementMechanismEdit(params);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,179 @@
<template>
<el-form
:model="searchForm"
label-width="80px"
@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="8">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYDRILLORGMEMBER_ID"
:data="list"
@get-data="fnGetData"
>
<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="EMERGENCYDRILLORG_NAME"
label="应急指挥机构"
width="110"
/>
<el-table-column prop="MEMBER_NAME" label="姓名" />
<el-table-column prop="MEMBER_UNIT" label="单位" />
<el-table-column prop="MEMBER_DUTY" label="职务" />
<el-table-column prop="MEMBER_PHONE" label="联系电话" width="110" />
<el-table-column
prop="MEMBER_EMERGENCY_PHONE"
label="紧急联系电话"
width="110"
/>
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnAddOrEdit(row.EMERGENCYDRILLORGMEMBER_ID, 'edit')"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="fnDelete(row.EMERGENCYDRILLORGMEMBER_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAddOrEdit('', 'add')">
新增
</el-button>
<el-button type="danger" @click="fnDeleteAll"> </el-button>
</template>
</layout-table>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:emergency-drill-basic-id="emergencyDrillBasicId"
:commanding-organization-list="
data.addOrEditDialog.commandingOrganizationList
"
@get-data="fnResetPagination"
/>
</template>
<script setup>
import { nextTick, reactive } from "vue";
import {
getEmergencyDrillManagementPersonnelList,
getEmergencyDrillManagementPersonnelView,
getEmergencyDrillManagementViewCommandingOrganization,
setEmergencyDrillManagementPersonnelDelete,
setEmergencyDrillManagementPersonnelDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import { serialNumber } from "@/assets/js/utils.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useListData from "@/assets/js/useListData.js";
import Add from "./personnel_add.vue";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const { list, searchForm, pagination, fnResetPagination, fnGetData, tableRef } =
useListData(getEmergencyDrillManagementPersonnelList, {
otherParams: {
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
},
});
const data = reactive({
addOrEditDialog: {
visible: false,
type: "",
commandingOrganizationList: [],
form: {
EMERGENCYDRILLORG_ID: "",
MEMBER_NAME: "",
MEMBER_UNIT: "",
MEMBER_DUTY: "",
MEMBER_PHONE: "",
MEMBER_EMERGENCY_PHONE: "",
},
},
});
const fnDelete = debounce(
1000,
async (EMERGENCYDRILLORGMEMBER_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementPersonnelDelete({
EMERGENCYDRILLORGMEMBER_ID,
});
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYDRILLORGMEMBER_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementPersonnelDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnAddOrEdit = async (EMERGENCYDRILLORGMEMBER_ID, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
const resData = await getEmergencyDrillManagementViewCommandingOrganization({
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
});
data.addOrEditDialog.commandingOrganizationList = resData.list;
if (type === "edit") {
const resData = await getEmergencyDrillManagementPersonnelView({
EMERGENCYDRILLORGMEMBER_ID,
});
data.addOrEditDialog.form = resData.pd;
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,135 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
@close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="应急指挥机构" prop="EMERGENCYDRILLORG_ID">
<el-select v-model="form.EMERGENCYDRILLORG_ID">
<el-option
v-for="item in commandingOrganizationList"
:key="item.EMERGENCYDRILLORG_ID"
:label="item.ORG_NAME"
:value="item.EMERGENCYDRILLORG_ID"
/>
</el-select>
</el-form-item>
<el-form-item label="姓名" prop="MEMBER_NAME">
<el-input v-model="form.MEMBER_NAME" />
</el-form-item>
<el-form-item label="单位" prop="MEMBER_UNIT">
<el-input v-model="form.MEMBER_UNIT" />
</el-form-item>
<el-form-item label="职务" prop="MEMBER_DUTY">
<el-input v-model="form.MEMBER_DUTY" />
</el-form-item>
<el-form-item label="联系电话" prop="MEMBER_PHONE">
<el-input v-model="form.MEMBER_PHONE" />
</el-form-item>
<el-form-item label="紧急联系电话" prop="MEMBER_EMERGENCY_PHONE">
<el-input v-model="form.MEMBER_EMERGENCY_PHONE" />
</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 { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
setEmergencyDrillManagementPersonnelAdd,
setEmergencyDrillManagementPersonnelEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
default: false,
required: true,
},
form: {
type: Object,
default: () => ({}),
required: true,
},
type: {
type: String,
default: "add",
required: true,
},
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
commandingOrganizationList: {
type: Array,
default: () => [],
required: true,
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
EMERGENCYDRILLORG_ID: [
{
required: true,
message: "应急指挥机构不能为空",
trigger: "change",
},
],
MEMBER_NAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
MEMBER_UNIT: [{ required: true, message: "单位不能为空", trigger: "blur" }],
MEMBER_DUTY: [{ required: true, message: "职务不能为空", trigger: "blur" }],
MEMBER_PHONE: [
{ required: true, message: "请输入手机号码", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: "请输入正确的手机号码",
},
],
MEMBER_EMERGENCY_PHONE: [
{ required: true, message: "请输入紧急联系电话", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: "请输入正确的手机号码",
},
],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = {
...form.value,
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
};
props.type === "add"
? await setEmergencyDrillManagementPersonnelAdd(params)
: await setEmergencyDrillManagementPersonnelEdit(params);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,138 @@
<template>
<el-form ref="formRef" :rules="rules" :model="form" label-width="140px">
<el-form-item label="应急演练方案名称" prop="DRILL_NAME">
<el-input v-model="form.DRILL_NAME" />
</el-form-item>
<el-form-item label="演练单位" prop="DRILL_UNIT">
<el-input v-model="form.DRILL_UNIT" />
</el-form-item>
<el-form-item label="演练时间" prop="DRILL_DATE">
<el-date-picker
v-model="form.DRILL_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
<el-form-item label="演练目的" prop="DRILL_PURPOSE">
<el-input
v-model="form.DRILL_PURPOSE"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
<el-form-item label="演练特点" prop="DRILL_PROPERTY">
<el-input
v-model="form.DRILL_PROPERTY"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
<el-form-item label="应急演练地点" prop="DRILL_PLACE">
<el-input v-model="form.DRILL_PLACE" />
</el-form-item>
<el-form-item label="参加人员" prop="DRILL_ATTENDERS">
<el-input v-model="form.DRILL_ATTENDERS" />
</el-form-item>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit(0)"></el-button>
<el-button type="success" @click="fnSubmit(1)"></el-button>
</div>
</template>
<script setup>
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import {
getEmergencyDrillManagementViewInfo,
setEmergencyDrillManagementInfoAdd,
setEmergencyDrillManagementInfoEdit,
} from "@/request/emergency_resource_management.js";
import { useRoute, useRouter } from "vue-router";
import useFormValidate from "@/assets/js/useFormValidate.js";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
activeName: {
type: String,
required: true,
},
});
const route = useRoute();
const router = useRouter();
const rules = {
DRILL_NAME: [
{ required: true, message: "应急演练方案名称不能为空", trigger: "blur" },
],
DRILL_UNIT: [
{ required: true, message: "演练单位不能为空", trigger: "blur" },
],
DRILL_DATE: [
{ required: true, message: "演练时间不能为空", trigger: "change" },
],
DRILL_PURPOSE: [
{ required: true, message: "演练目的不能为空", trigger: "blur" },
],
DRILL_PROPERTY: [
{ required: true, message: "演练特点不能为空", trigger: "blur" },
],
DRILL_PLACE: [
{ required: true, message: "应急演练地点不能为空", trigger: "blur" },
],
DRILL_ATTENDERS: [
{ required: true, message: "参加人员不能为空", trigger: "blur" },
],
};
const form = ref({
DRILL_NAME: "",
DRILL_UNIT: "",
DRILL_DATE: "",
DRILL_PURPOSE: "",
DRILL_PROPERTY: "",
DRILL_PLACE: "",
DRILL_ATTENDERS: "",
});
const formRef = ref(null);
const fnGetData = async () => {
if (!props.emergencyDrillBasicId) return;
const resData = await getEmergencyDrillManagementViewInfo({
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
});
form.value = resData.pd;
};
fnGetData();
const fnSubmit = debounce(
1000,
async (type) => {
await useFormValidate(formRef);
let EMERGENCYDRILLBASIC_ID = props.emergencyDrillBasicId;
if (props.emergencyDrillBasicId)
await setEmergencyDrillManagementInfoEdit({ ...form.value });
else {
const resData = await setEmergencyDrillManagementInfoAdd({
...form.value,
});
EMERGENCYDRILLBASIC_ID = resData.pd.EMERGENCYDRILLBASIC_ID;
}
ElMessage.success("操作成功");
let activeName = props.activeName;
if (type === 1) activeName = "commandingOrganization";
await router.replace({
path: route.path,
query: {
activeName,
EMERGENCYDRILLBASIC_ID,
},
});
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,151 @@
<template>
<el-form
:model="searchForm"
label-width="80px"
@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="8">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYDRILLCONTENT_ID"
:data="list"
@get-data="fnGetData"
>
<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="DRILL_CONTENT" label="演练内容" />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnAddOrEdit(row.EMERGENCYDRILLCONTENT_ID, 'edit')"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="fnDelete(row.EMERGENCYDRILLCONTENT_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAddOrEdit('', 'add')">
新增
</el-button>
<el-button type="danger" @click="fnDeleteAll"> </el-button>
</template>
</layout-table>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:emergency-drill-basic-id="emergencyDrillBasicId"
@get-data="fnResetPagination"
/>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import {
getEmergencyDrillManagementContentList,
getEmergencyDrillManagementContentView,
setEmergencyDrillManagementContentDelete,
setEmergencyDrillManagementContentDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import { nextTick, reactive } from "vue";
import Add from "./content_add.vue";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getEmergencyDrillManagementContentList, {
otherParams: { EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId },
});
const data = reactive({
addOrEditDialog: {
visible: false,
type: "",
form: {
DRILL_CONTENT: "",
DRILL_CONTENT_NUM: "",
},
},
});
const fnDelete = debounce(
1000,
async (EMERGENCYDRILLCONTENT_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementContentDelete({
EMERGENCYDRILLCONTENT_ID,
});
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYDRILLCONTENT_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementContentDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnAddOrEdit = async (EMERGENCYDRILLCONTENT_ID, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
if (type === "edit") {
const resData = await getEmergencyDrillManagementContentView({
EMERGENCYDRILLCONTENT_ID,
});
data.addOrEditDialog.form = resData.pd;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,89 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
@close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="演练内容" prop="DRILL_CONTENT">
<el-input v-model="form.DRILL_CONTENT" />
</el-form-item>
<el-form-item label="演练内容序号" prop="DRILL_CONTENT_NUM">
<el-input v-model="form.DRILL_CONTENT_NUM" />
</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 { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
setEmergencyDrillManagementContentAdd,
setEmergencyDrillManagementContentEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
import { useVModels } from "@vueuse/core";
import { ref } from "vue";
const props = defineProps({
visible: {
type: Boolean,
default: false,
required: true,
},
form: {
type: Object,
default: () => ({}),
required: true,
},
type: {
type: String,
default: "add",
required: true,
},
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
DRILL_CONTENT: [
{ required: true, message: "演练内容不能为空", trigger: "blur" },
],
DRILL_CONTENT_NUM: [
{ required: true, message: "演练内容序号不能为空", trigger: "blur" },
],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = {
...form.value,
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
};
props.type === "add"
? await setEmergencyDrillManagementContentAdd(params)
: await setEmergencyDrillManagementContentEdit(params);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,57 @@
<template>
<el-row :gutter="24" class="pb-20">
<el-col :span="12" style="border-right: 1px dashed var(--el-border-color)">
<content :emergency-drill-basic-id="emergencyDrillBasicId" />
</el-col>
<el-col :span="12">
<scene :emergency-drill-basic-id="emergencyDrillBasicId" />
</el-col>
</el-row>
<div class="tc pt-20" style="border-top: 1px dashed var(--el-border-color)">
<el-button
@click="
router.replace({
path: route.path,
query: {
activeName: 'commandingOrganization',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
上一步
</el-button>
<el-button
type="primary"
@click="
router.replace({
path: route.path,
query: {
activeName: 'summaryEvaluation',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
下一步
</el-button>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router";
import Content from "./content.vue";
import Scene from "./scene.vue";
const router = useRouter();
const route = useRoute();
defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
</script>
<style scoped></style>

View File

@ -0,0 +1,151 @@
<template>
<el-form
:model="searchForm"
label-width="80px"
@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="8">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYDRILLSCENE_ID"
:data="list"
@get-data="fnGetData"
>
<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="DRILL_SCENE" label="演练场景" />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnAddOrEdit(row.EMERGENCYDRILLSCENE_ID, 'edit')"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="fnDelete(row.EMERGENCYDRILLSCENE_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAddOrEdit('', 'add')">
新增
</el-button>
<el-button type="danger" @click="fnDeleteAll"> </el-button>
</template>
</layout-table>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:emergency-drill-basic-id="emergencyDrillBasicId"
@get-data="fnResetPagination"
/>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import {
getEmergencyDrillManagementSceneList,
getEmergencyDrillManagementSceneView,
setEmergencyDrillManagementSceneDelete,
setEmergencyDrillManagementSceneDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import { nextTick, reactive } from "vue";
import useListData from "@/assets/js/useListData.js";
import Add from "./scene_add.vue";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getEmergencyDrillManagementSceneList, {
otherParams: { EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId },
});
const data = reactive({
addOrEditDialog: {
visible: false,
type: "",
form: {
DRILL_SCENE: "",
DRILL_SCENE_NUM: "",
},
},
});
const fnDelete = debounce(
1000,
async (EMERGENCYDRILLSCENE_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementSceneDelete({
EMERGENCYDRILLSCENE_ID,
});
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYDRILLSCENE_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementSceneDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnAddOrEdit = async (EMERGENCYDRILLSCENE_ID, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
if (type === "edit") {
const resData = await getEmergencyDrillManagementSceneView({
EMERGENCYDRILLSCENE_ID,
});
data.addOrEditDialog.form = resData.pd;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,88 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
@close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-form-item label="演练场景" prop="DRILL_SCENE">
<el-input v-model="form.DRILL_SCENE" />
</el-form-item>
<el-form-item label="演练场景序号" prop="DRILL_SCENE_NUM">
<el-input v-model="form.DRILL_SCENE_NUM" />
</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 { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
setEmergencyDrillManagementSceneAdd,
setEmergencyDrillManagementSceneEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
import { useVModels } from "@vueuse/core";
import { ref } from "vue";
const props = defineProps({
visible: {
type: Boolean,
default: false,
required: true,
},
form: {
type: Object,
default: () => ({}),
required: true,
},
type: {
type: String,
default: "add",
required: true,
},
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
DRILL_SCENE: [
{ required: true, message: "演练场景不能为空", trigger: "blur" },
],
DRILL_SCENE_NUM: [
{ required: true, message: "演练场景序号不能为空", trigger: "blur" },
],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = {
...form.value,
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
};
props.type === "add"
? await setEmergencyDrillManagementSceneAdd(params)
: await setEmergencyDrillManagementSceneEdit(params);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,99 @@
<template>
<div>
<el-form ref="formRef" :rules="rules" :model="form" label-width="80px">
<el-form-item label="附件" prop="file">
<layout-upload v-model:file-list="form.file" />
</el-form-item>
</el-form>
<div class="tc mt-10">
<el-button
@click="
router.replace({
path: route.path,
query: {
activeName: 'summaryEvaluation',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
上一步
</el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import {
getEmergencyDrillManagementViewSchemeText,
setEmergencyDrillManagementViewSchemeTextAdd,
setEmergencyDrillManagementViewSchemeTextEdit,
} from "@/request/emergency_resource_management.js";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import LayoutUpload from "@/components/upload/index.vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
activeName: {
type: String,
required: true,
},
});
const FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const router = useRouter();
const rules = {
file: [{ required: true, message: "附件不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const form = ref({
file: [],
});
let requestType = "add";
const fnGetData = async () => {
const resData = await getEmergencyDrillManagementViewSchemeText({
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
});
if (!resData.pd) return;
form.value = resData.pd;
form.value.file = [
{
url: FILE_URL + resData.pd.DRILL_ATTACHMENT_FILE_PATH,
name: resData.pd.DRILL_ATTACHMENT_FILE_NAME,
},
];
requestType = "edit";
};
fnGetData();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
formData.delete("file");
formData.append("file", form.value.file[0].raw);
formData.append("DRILL_REPORT_FILE_NAME", form.value.file[0].name);
formData.append("EMERGENCYDRILLBASIC_ID", props.emergencyDrillBasicId);
requestType === "add"
? await setEmergencyDrillManagementViewSchemeTextAdd(formData)
: await setEmergencyDrillManagementViewSchemeTextEdit(formData);
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,119 @@
<template>
<div>
<el-form ref="formRef" :rules="rules" :model="form" label-width="80px">
<el-form-item label="总结评估" prop="DRILL_REPORT">
<el-input
v-model="form.DRILL_REPORT"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
<el-form-item label="附件" prop="file">
<layout-upload v-model:file-list="form.file" />
</el-form-item>
</el-form>
<div class="tc mt-10">
<el-button
@click="
router.replace({
path: route.path,
query: {
activeName: 'exerciseContentAndScenario',
EMERGENCYDRILLBASIC_ID: emergencyDrillBasicId,
},
})
"
>
上一步
</el-button>
<el-button type="primary" @click="fnSubmit(0)"></el-button>
<el-button type="success" @click="fnSubmit(1)"></el-button>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import {
getEmergencyDrillManagementViewSummaryEvaluation,
setEmergencyDrillManagementViewSummaryEvaluationAdd,
setEmergencyDrillManagementViewSummaryEvaluationEdit,
} from "@/request/emergency_resource_management.js";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import LayoutUpload from "@/components/upload/index.vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
const props = defineProps({
emergencyDrillBasicId: {
type: String,
default: "",
required: true,
},
activeName: {
type: String,
required: true,
},
});
const FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const router = useRouter();
const rules = {
DRILL_REPORT: [
{ required: true, message: "总结评估不能为空", trigger: "blur" },
],
file: [{ required: true, message: "附件不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const form = ref({
DRILL_REPORT: "",
file: [],
});
let requestType = "add";
const fnGetData = async () => {
const resData = await getEmergencyDrillManagementViewSummaryEvaluation({
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
});
if (!resData.pd) return;
form.value = resData.pd;
form.value.file = [
{
url: FILE_URL + resData.pd.DRILL_REPORT_FILE_PATH,
name: resData.pd.DRILL_REPORT_FILE_NAME,
},
];
requestType = "edit";
};
fnGetData();
const fnSubmit = debounce(
1000,
async (type) => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
formData.delete("file");
formData.append("file", form.value.file[0].raw);
formData.append("DRILL_REPORT_FILE_NAME", form.value.file[0].name);
formData.append("EMERGENCYDRILLBASIC_ID", props.emergencyDrillBasicId);
requestType === "add"
? await setEmergencyDrillManagementViewSummaryEvaluationAdd(formData)
: await setEmergencyDrillManagementViewSummaryEvaluationEdit(formData);
ElMessage.success("操作成功");
let activeName = props.activeName;
if (type === 1) activeName = "schemeText";
await router.replace({
path: route.path,
query: {
activeName,
EMERGENCYDRILLBASIC_ID: props.emergencyDrillBasicId,
},
});
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,192 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item
label="应急演练方案名称"
prop="KEYWORDS"
label-width="140px"
>
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="演练时间" prop="CATEGORY">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<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"
v-model:pagination="pagination"
row-key="EMERGENCYDRILLBASIC_ID"
:data="list"
@get-data="fnGetDataTransfer"
>
<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="DRILL_NAME"
label="应急演练方案名称"
show-overflow-tooltip
/>
<el-table-column
prop="DRILL_UNIT"
label="演练单位"
show-overflow-tooltip
/>
<el-table-column prop="DRILL_DATE" label="演练时间" width="130" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_drill_management/view',
query: { EMERGENCYDRILLBASIC_ID: row.EMERGENCYDRILLBASIC_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_drill_management/edit',
query: { EMERGENCYDRILLBASIC_ID: row.EMERGENCYDRILLBASIC_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.EMERGENCYDRILLBASIC_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/emergency_resource_management/emergency_drill_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import {
getEmergencyDrillManagementList,
setEmergencyDrillManagementDelete,
setEmergencyDrillManagementDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, searchForm, pagination, fnGetData, fnResetPagination, tableRef } =
useListData(getEmergencyDrillManagementList);
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const buttonJurisdiction = await useButtonJurisdiction("emergencydrillbasic");
const fnDelete = debounce(
1000,
async (EMERGENCYDRILLBASIC_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementDelete({ EMERGENCYDRILLBASIC_ID });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYDRILLBASIC_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyDrillManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,203 @@
<template>
<layout-card>
<el-divider content-position="left">应急方案基本信息</el-divider>
<el-descriptions border :column="2">
<el-descriptions-item label="应急演练方案名称" :span="2">
{{ data.info.DRILL_NAME }}
</el-descriptions-item>
<el-descriptions-item label="演练单位">
{{ data.info.DRILL_UNIT }}
</el-descriptions-item>
<el-descriptions-item label="演练时间">
{{ data.info.DRILL_DATE }}
</el-descriptions-item>
<el-descriptions-item label="演练目的">
{{ data.info.DRILL_PURPOSE }}
</el-descriptions-item>
<el-descriptions-item label="演练特点">
{{ data.info.DRILL_PROPERTY }}
</el-descriptions-item>
<el-descriptions-item label="应急演练地点">
{{ data.info.DRILL_PLACE }}
</el-descriptions-item>
<el-descriptions-item label="参加人员">
{{ data.info.DRILL_ATTENDERS }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">应急指挥机构</el-divider>
<layout-table
:data="data.commandingOrganizationList"
:show-pagination="false"
>
<el-table-column type="index" label="序号" width="50" />
<el-table-column prop="ORG_NAME" label="机构名称" />
<el-table-column prop="ORG_UNIT_IDS" label="组成单位" />
<el-table-column prop="ORG_DUTY" label="机构职责" />
</layout-table>
<el-divider content-position="left">应急指挥机构人员</el-divider>
<layout-table
:data="data.commandingOrganizationPersonnelList"
:show-pagination="false"
>
<el-table-column type="index" label="序号" width="50" />
<el-table-column
prop="EMERGENCYDRILLORG_NAME"
label="应急指挥机构"
width="260"
/>
<el-table-column prop="MEMBER_NAME" label="姓名" width="110" />
<el-table-column prop="MEMBER_DUTY" label="职务" width="110" />
<el-table-column prop="MEMBER_PHONE" label="联系电话" width="200" />
<el-table-column
prop="MEMBER_EMERGENCY_PHONE"
label="紧急联系电话"
width="200"
/>
<el-table-column prop="MEMBER_UNIT" label="单位" />
</layout-table>
<el-divider content-position="left">演练内容</el-divider>
<layout-table :data="data.drillContentList" :show-pagination="false">
<el-table-column type="index" label="序号" width="50" />
<el-table-column
prop="DRILL_CONTENT_NUM"
label="演练内容序号"
width="120"
/>
<el-table-column prop="DRILL_CONTENT" label="演练内容" />
</layout-table>
<el-divider content-position="left">演练场景</el-divider>
<layout-table :data="data.drillSceneList" :show-pagination="false">
<el-table-column type="index" label="序号" width="50" />
<el-table-column
prop="DRILL_SCENE_NUM"
label="演练场景序号"
width="120"
/>
<el-table-column prop="DRILL_SCENE" label="演练场景" />
</layout-table>
<el-divider content-position="left">总结评估</el-divider>
<el-descriptions border>
<el-descriptions-item label="总结评估">
{{ data.summaryEvaluationInfo.DRILL_REPORT }}
</el-descriptions-item>
<el-descriptions-item
v-if="data.summaryEvaluationInfo.DRILL_REPORT_FILE_PATH"
label="附件"
>
{{ data.summaryEvaluationInfo.DRILL_REPORT_FILE_NAME }}
<el-button
class="ml-10"
type="primary"
@click="
useDownloadFile(
data.summaryEvaluationInfo.DRILL_REPORT_FILE_PATH,
data.summaryEvaluationInfo.DRILL_REPORT_FILE_NAME
)
"
>
下载
</el-button>
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">应急演练方案文本</el-divider>
<el-descriptions border>
<el-descriptions-item
v-if="data.schemeTextInfo.DRILL_ATTACHMENT_FILE_PATH"
label="附件"
>
{{ data.schemeTextInfo.DRILL_ATTACHMENT_FILE_NAME }}
<el-button
class="ml-10"
type="primary"
@click="
useDownloadFile(
data.schemeTextInfo.DRILL_ATTACHMENT_FILE_PATH,
data.schemeTextInfo.DRILL_ATTACHMENT_FILE_NAME
)
"
>
下载
</el-button>
</el-descriptions-item>
</el-descriptions>
</layout-card>
</template>
<script setup>
import { useRoute } from "vue-router";
import {
getEmergencyDrillManagementViewCommandingOrganization,
getEmergencyDrillManagementViewCommandingOrganizationPersonnel,
getEmergencyDrillManagementViewDrillContent,
getEmergencyDrillManagementViewDrillScene,
getEmergencyDrillManagementViewInfo,
getEmergencyDrillManagementViewSchemeText,
getEmergencyDrillManagementViewSummaryEvaluation,
} from "@/request/emergency_resource_management.js";
import { reactive } from "vue";
import useDownloadFile from "@/assets/js/useDownloadFile.js";
const route = useRoute();
const { EMERGENCYDRILLBASIC_ID } = route.query;
const data = reactive({
info: {},
commandingOrganizationList: [],
commandingOrganizationPersonnelList: [],
drillContentList: [],
drillSceneList: [],
summaryEvaluationInfo: {},
schemeTextInfo: {},
});
const fnGetData = async () => {
const resData = await getEmergencyDrillManagementViewInfo({
EMERGENCYDRILLBASIC_ID,
});
data.info = resData.pd;
};
const fnGetDataCommandingOrganization = async () => {
const resData = await getEmergencyDrillManagementViewCommandingOrganization({
EMERGENCYDRILLBASIC_ID,
});
data.commandingOrganizationList = resData.list;
};
const fnGetDataCommandingOrganizationPersonnel = async () => {
const resData =
await getEmergencyDrillManagementViewCommandingOrganizationPersonnel({
EMERGENCYDRILLBASIC_ID,
});
data.commandingOrganizationPersonnelList = resData.list;
};
const fnGetDataDrillContent = async () => {
const resData = await getEmergencyDrillManagementViewDrillContent({
EMERGENCYDRILLBASIC_ID,
});
data.drillContentList = resData.list;
};
const fnGetDataDrillScene = async () => {
const resData = await getEmergencyDrillManagementViewDrillScene({
EMERGENCYDRILLBASIC_ID,
});
data.drillSceneList = resData.list;
};
const fnGetDataSummaryEvaluation = async () => {
const resData = await getEmergencyDrillManagementViewSummaryEvaluation({
EMERGENCYDRILLBASIC_ID,
});
data.summaryEvaluationInfo = resData.pd;
};
const fnGetDataSchemeText = async () => {
const resData = await getEmergencyDrillManagementViewSchemeText({
EMERGENCYDRILLBASIC_ID,
});
data.schemeTextInfo = resData.pd;
};
fnGetData();
fnGetDataCommandingOrganization();
fnGetDataCommandingOrganizationPersonnel();
fnGetDataDrillContent();
fnGetDataDrillScene();
fnGetDataSummaryEvaluation();
fnGetDataSchemeText();
</script>
<style scoped></style>

View File

@ -0,0 +1,170 @@
<template>
<layout-card>
<el-form ref="formRef" :rules="rules" :model="form" label-width="140px">
<el-row>
<el-col :span="12">
<el-form-item label="装备名称" prop="EQUIP_NAME">
<el-input v-model="form.EQUIP_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备类别" prop="CATEGORY">
<el-select v-model="form.CATEGORY">
<el-option
v-for="item in equipmentCategoryList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="SPEC">
<el-input v-model="form.SPEC" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术性能指标" prop="EQUIP_PERFORMANCE">
<el-input v-model="form.EQUIP_PERFORMANCE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保养周期" prop="MAINTAIN_DATE">
<el-input v-model="form.MAINTAIN_DATE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效期" prop="VALIDATE_DATE">
<el-date-picker
v-model="form.VALIDATE_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用途" prop="USE">
<el-input v-model="form.USE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="存放场所" prop="STORAGE_PLACE">
<el-input v-model="form.STORAGE_PLACE" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="用途说明" prop="USE_DESC">
<el-input
v-model="form.USE_DESC"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责保管人姓名" prop="STORAGE_PERSON_NAME">
<el-input v-model="form.STORAGE_PERSON_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责保管人电话" prop="STORAGE_PERSON_PHONE">
<el-input v-model="form.STORAGE_PERSON_PHONE" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mt-10 tc">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
getEmergencyEquipmentManagementView,
setEmergencyEquipmentManagementAdd,
setEmergencyEquipmentManagementEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
import { layoutFnGetEquipmentCategory } from "@/assets/js/data_dictionary.js";
const router = useRouter();
const route = useRoute();
const { EMERGENCYEQUIPMENT_ID } = route.query;
const rules = {
EQUIP_NAME: [
{ required: true, message: "装备名称不能为空", trigger: "blur" },
],
CATEGORY: [{ required: true, message: "请选择装备类别", trigger: "change" }],
SPEC: [{ required: true, message: "规格型号不能为空", trigger: "blur" }],
EQUIP_PERFORMANCE: [
{ required: true, message: "技术性能指标不能为空", trigger: "blur" },
],
MAINTAIN_DATE: [
{ required: true, message: "保养周期不能为空", trigger: "blur" },
],
VALIDATE_DATE: [
{ required: true, message: "有效期不能为空", trigger: "change" },
],
USE: [{ required: true, message: "用途不能为空", trigger: "blur" }],
USE_DESC: [{ required: true, message: "用途说明不能为空", trigger: "blur" }],
STORAGE_PLACE: [
{ required: true, message: "存放场所不能为空", trigger: "blur" },
],
STORAGE_PERSON_NAME: [
{ required: true, message: "负责保管人姓名不能为空", trigger: "blur" },
],
STORAGE_PERSON_PHONE: [
{ required: true, message: "请输入负责保管人电话", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: "请输入正确的手机号码",
},
],
};
const form = ref({
EQUIP_NAME: "",
CATEGORY: "",
SPEC: "",
EQUIP_PERFORMANCE: "",
MAINTAIN_DATE: "",
VALIDATE_DATE: "",
USE: "",
USE_DESC: "",
STORAGE_PLACE: "",
STORAGE_PERSON_NAME: "",
STORAGE_PERSON_PHONE: "",
});
const formRef = ref(null);
const fnGetData = async () => {
if (!EMERGENCYEQUIPMENT_ID) return;
const resData = await getEmergencyEquipmentManagementView({
EMERGENCYEQUIPMENT_ID,
});
form.value = resData.pd;
};
fnGetData();
const equipmentCategoryList = await layoutFnGetEquipmentCategory();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
!EMERGENCYEQUIPMENT_ID
? await setEmergencyEquipmentManagementAdd({ ...form.value })
: await setEmergencyEquipmentManagementEdit({ ...form.value });
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,183 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@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="装备类别" prop="CATEGORY">
<el-select v-model="searchForm.CATEGORY">
<el-option
v-for="item in equipmentCategoryList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYEQUIPMENT_ID"
:data="list"
@get-data="fnGetData"
>
<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="装备名称" show-overflow-tooltip>
<template #default="{ row }">
<span
:class="{
'text-red':
dayjs(row.VALIDATE_DATE).format('YYYY-MM-DD') <
dayjs().format('YYYY-MM-DD'),
}"
>
{{ row.EQUIP_NAME }}
</span>
</template>
</el-table-column>
<el-table-column prop="CATEGORY_NAME" label="装备类别" />
<el-table-column prop="SPEC" label="规格型号" />
<el-table-column prop="USE" label="用途" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_equipment_management/view',
query: { EMERGENCYEQUIPMENT_ID: row.EMERGENCYEQUIPMENT_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_equipment_management/edit',
query: { EMERGENCYEQUIPMENT_ID: row.EMERGENCYEQUIPMENT_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.EMERGENCYEQUIPMENT_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/emergency_resource_management/emergency_equipment_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import dayjs from "dayjs";
import { serialNumber } from "@/assets/js/utils";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import {
getEmergencyEquipmentManagementList,
setEmergencyEquipmentManagementDelete,
setEmergencyEquipmentManagementDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { layoutFnGetEquipmentCategory } from "@/assets/js/data_dictionary.js";
import useListData from "@/assets/js/useListData.js";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, searchForm, pagination, fnResetPagination, fnGetData, tableRef } =
useListData(getEmergencyEquipmentManagementList);
const buttonJurisdiction = await useButtonJurisdiction("emergencyequipment");
const equipmentCategoryList = await layoutFnGetEquipmentCategory();
const fnDelete = debounce(
1000,
async (EMERGENCYEQUIPMENT_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyEquipmentManagementDelete({ EMERGENCYEQUIPMENT_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYEQUIPMENT_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyEquipmentManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,58 @@
<template>
<layout-card>
<el-descriptions border :column="2">
<el-descriptions-item label="装备名称">
{{ info.EQUIP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="装备类别">
{{ info.CATEGORY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="规格型号">
{{ info.SPEC }}
</el-descriptions-item>
<el-descriptions-item label="技术性能指标">
{{ info.EQUIP_PERFORMANCE }}
</el-descriptions-item>
<el-descriptions-item label="保养周期">
{{ info.MAINTAIN_DATE }}
</el-descriptions-item>
<el-descriptions-item label="有效期">
{{ info.VALIDATE_DATE }}
</el-descriptions-item>
<el-descriptions-item label="用途">
{{ info.USE }}
</el-descriptions-item>
<el-descriptions-item label="存放场所">
{{ info.STORAGE_PLACE }}
</el-descriptions-item>
<el-descriptions-item label="用途说明" :span="2">
{{ info.USE_DESC }}
</el-descriptions-item>
<el-descriptions-item label="负责保管人姓名">
{{ info.STORAGE_PERSON_NAME }}
</el-descriptions-item>
<el-descriptions-item label="负责保管人电话">
{{ info.STORAGE_PERSON_PHONE }}
</el-descriptions-item>
</el-descriptions>
</layout-card>
</template>
<script setup>
import { useRoute } from "vue-router";
import { getEmergencyEquipmentManagementView } from "@/request/emergency_resource_management.js";
import { ref } from "vue";
const route = useRoute();
const { EMERGENCYEQUIPMENT_ID } = route.query;
const info = ref({});
const fnGetData = async () => {
const resData = await getEmergencyEquipmentManagementView({
EMERGENCYEQUIPMENT_ID,
});
info.value = resData.pd;
};
fnGetData();
</script>
<style scoped></style>

View File

@ -0,0 +1,283 @@
<template>
<layout-card>
<el-form ref="formRef" :rules="rules" :model="form" label-width="110px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="应急预案名称" prop="PLAN_NAME">
<el-input v-model="form.PLAN_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预案编号" prop="PLAN_NO">
<el-input v-model="form.PLAN_NO" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="适用领域" prop="PLAN_USE_SCOPE">
<el-select v-model="form.PLAN_USE_SCOPE">
<el-option
v-for="item in applicableFieldsList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预案类别" prop="PLAN_CATEGORY">
<el-select v-model="form.PLAN_CATEGORY">
<el-option
v-for="item in planCategoryList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预案级别" prop="PLAN_LEVEL">
<el-select v-model="form.PLAN_LEVEL">
<el-option
v-for="item in planLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编制单位" prop="ESTAB_UNIT">
<el-input v-model="form.ESTAB_UNIT" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编制人" prop="ESTAB_USER">
<el-input v-model="form.ESTAB_USER" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布日期" prop="PUBLISH_DATE">
<el-date-picker
v-model="form.PUBLISH_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布文号" prop="PUBLISH_DOC_NO">
<el-input v-model="form.PUBLISH_DOC_NO" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发布单位" prop="PUBLISH_UNIT">
<el-input v-model="form.PUBLISH_UNIT" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="签发人" prop="ISSUER">
<el-input v-model="form.ISSUER" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预案备案状态" prop="PLAN_RECORD_STATUS">
<el-select v-model="form.PLAN_RECORD_STATUS">
<el-option
v-for="item in planFilingStatusList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{
required: form.PLAN_RECORD_STATUS === 'STATUS01',
message: '预案备案时间不能为空',
trigger: 'blur',
}"
label="预案备案时间"
prop="PLAN_RECORD_DATE"
>
<el-date-picker
v-model="form.PLAN_RECORD_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{
required: form.PLAN_RECORD_STATUS === 'STATUS01',
message: '备案接收单位不能为空',
trigger: 'blur',
}"
label="备案接收单位"
prop="PLAN_RECORD_UNIT"
>
<el-input v-model="form.PLAN_RECORD_UNIT" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{
required: form.PLAN_RECORD_STATUS === 'STATUS01',
message: '预案摘要不能为空',
trigger: 'blur',
}"
label="预案摘要"
prop="PLAN_SUMMARY"
>
<el-input
v-model="form.PLAN_SUMMARY"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="PLAN_REMARK">
<el-input
v-model="form.PLAN_REMARK"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="相关附件" prop="file">
<layout-upload v-model:file-list="form.file" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mt-10 tc">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutUpload from "@/components/upload/index.vue";
import {
layoutFnGetApplicableFields,
layoutFnGetPlanCategory,
layoutFnGetPlanFilingStatus,
layoutFnGetPlanLevel,
} from "@/assets/js/data_dictionary.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
getEmergencyPlanManagementView,
setEmergencyPlanManagementAdd,
setEmergencyPlanManagementEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
const { EMERGENCYPLAN_ID } = route.query;
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const rules = {
PLAN_NAME: [
{ required: true, message: "应急预案名称不能为空", trigger: "blur" },
],
PLAN_NO: [{ required: true, message: "预案编号不能为空", trigger: "blur" }],
PLAN_USE_SCOPE: [
{ required: true, message: "请选择适用领域", trigger: "change" },
],
PLAN_CATEGORY: [
{ required: true, message: "请选择预案类别", trigger: "change" },
],
PLAN_LEVEL: [
{ required: true, message: "请选择预案级别", trigger: "change" },
],
ESTAB_UNIT: [
{ required: true, message: "编制单位不能为空", trigger: "blur" },
],
ESTAB_USER: [{ required: true, message: "编制人不能为空", trigger: "blur" }],
PUBLISH_DATE: [
{ required: true, message: "发布日期不能为空", trigger: "change" },
],
PUBLISH_DOC_NO: [
{ required: true, message: "发布文号不能为空", trigger: "blur" },
],
PUBLISH_UNIT: [
{ required: true, message: "发布单位不能为空", trigger: "blur" },
],
ISSUER: [{ required: true, message: "签发人不能为空", trigger: "blur" }],
PLAN_RECORD_STATUS: [
{ required: true, message: "请选择预案备案状态", trigger: "change" },
],
};
const form = ref({
PLAN_NAME: "",
PLAN_NO: "",
PLAN_USE_SCOPE: "",
PLAN_CATEGORY: "",
PLAN_LEVEL: "",
ESTAB_UNIT: "",
ESTAB_USER: "",
PUBLISH_DATE: "",
PUBLISH_DOC_NO: "",
PUBLISH_UNIT: "",
ISSUER: "",
PLAN_RECORD_STATUS: "",
PLAN_RECORD_DATE: "",
PLAN_RECORD_UNIT: "",
PLAN_SUMMARY: "",
PLAN_REMARK: "",
PLAN_ATTACH_NAME: "",
file: [],
});
const formRef = ref(null);
const fnGetData = async () => {
if (!EMERGENCYPLAN_ID) return;
const resData = await getEmergencyPlanManagementView({ EMERGENCYPLAN_ID });
form.value = resData.pd;
form.value.file = [
{
url: VITE_FILE_URL + resData.pd.PLAN_ATTACH_IDS,
name: resData.pd.PLAN_ATTACH_NAME,
},
];
};
fnGetData();
const applicableFieldsList = await layoutFnGetApplicableFields();
const planCategoryList = await layoutFnGetPlanCategory();
const planLevelList = await layoutFnGetPlanLevel();
const planFilingStatusList = await layoutFnGetPlanFilingStatus();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
if (form.value.file.length > 0) {
formData.delete("file");
formData.append("PLAN_ATTACH_NAME", form.value.file[0].name);
formData.append("file", form.value.file[0].raw);
}
!EMERGENCYPLAN_ID
? await setEmergencyPlanManagementAdd(formData)
: await setEmergencyPlanManagementEdit(formData);
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,178 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@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="4">
<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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYPLAN_ID"
:data="list"
@get-data="fnGetData"
>
<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="PLAN_NAME"
label="应急预案名称"
width="300"
show-overflow-tooltip
/>
<el-table-column
prop="PLAN_CATEGORY_NAME"
label="预案类别"
width="150"
/>
<el-table-column prop="PLAN_LEVEL_NAME" label="预案级别" width="150" />
<el-table-column
prop="PLAN_RECORD_STATUS_NAME"
label="备案状态"
width="150"
/>
<el-table-column label="相关附件">
<template #default="{ row }">
{{ row.PLAN_ATTACH_NAME }}
<layout-multiple-attachment-previews
:file-path="row.PLAN_ATTACH_IDS"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_plan_management/view',
query: { EMERGENCYPLAN_ID: row.EMERGENCYPLAN_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_plan_management/edit',
query: { EMERGENCYPLAN_ID: row.EMERGENCYPLAN_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.EMERGENCYPLAN_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/emergency_resource_management/emergency_plan_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import {
getEmergencyPlanManagementList,
setEmergencyPlanManagementDelete,
setEmergencyPlanManagementDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import LayoutMultipleAttachmentPreviews from "@/components/multiple_attachment_previews/index.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getEmergencyPlanManagementList);
const buttonJurisdiction = await useButtonJurisdiction("emergencyplan");
const fnDelete = debounce(
1000,
async (EMERGENCYPLAN_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyPlanManagementDelete({ EMERGENCYPLAN_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYPLAN_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyPlanManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,88 @@
<template>
<layout-card>
<el-descriptions border :column="2">
<el-descriptions-item label="应急预案名称" :span="2">
{{ info.PLAN_NAME }}
</el-descriptions-item>
<el-descriptions-item label="预案编号">
{{ info.PLAN_NO }}
</el-descriptions-item>
<el-descriptions-item label="适用领域">
{{ info.PLAN_USE_SCOPE_NAME }}
</el-descriptions-item>
<el-descriptions-item label="预案类别">
{{ info.PLAN_CATEGORY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="预案级别">
{{ info.PLAN_LEVEL_NAME }}
</el-descriptions-item>
<el-descriptions-item label="编制单位">
{{ info.ESTAB_UNIT }}
</el-descriptions-item>
<el-descriptions-item label="编制人">
{{ info.ESTAB_USER }}
</el-descriptions-item>
<el-descriptions-item label="发布日期">
{{ info.PUBLISH_DATE }}
</el-descriptions-item>
<el-descriptions-item label="发布文号">
{{ info.PUBLISH_DOC_NO }}
</el-descriptions-item>
<el-descriptions-item label="发布单位">
{{ info.PUBLISH_UNIT }}
</el-descriptions-item>
<el-descriptions-item label="签发人">
{{ info.ISSUER }}
</el-descriptions-item>
<el-descriptions-item label="预案备案状态">
{{ info.PLAN_RECORD_STATUS_NAME }}
</el-descriptions-item>
<el-descriptions-item label="预案备案时间">
{{ info.PLAN_RECORD_DATE }}
</el-descriptions-item>
<el-descriptions-item label="备案接收单位" :span="2">
{{ info.PLAN_RECORD_UNIT }}
</el-descriptions-item>
<el-descriptions-item label="预案摘要" :span="2">
{{ info.PLAN_SUMMARY }}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">
{{ info.PLAN_REMARK }}
</el-descriptions-item>
<el-descriptions-item
v-if="info.PLAN_ATTACH_IDS"
label="相关附件"
:span="2"
>
{{ info.PLAN_ATTACH_NAME }}
<el-button
class="ml-10"
type="primary"
@click="useDownloadFile(info.PLAN_ATTACH_IDS, info.PLAN_ATTACH_NAME)"
>
下载
</el-button>
</el-descriptions-item>
</el-descriptions>
</layout-card>
</template>
<script setup>
import { useRoute } from "vue-router";
import { getEmergencyPlanManagementView } from "@/request/emergency_resource_management.js";
import { ref } from "vue";
import useDownloadFile from "@/assets/js/useDownloadFile.js";
const route = useRoute();
const { EMERGENCYPLAN_ID } = route.query;
const info = ref({});
const fnGetData = async () => {
const resData = await getEmergencyPlanManagementView({
EMERGENCYPLAN_ID,
});
info.value = resData.pd;
};
fnGetData();
</script>
<style scoped></style>

View File

@ -0,0 +1,305 @@
<template>
<layout-card>
<el-form ref="formRef" :rules="rules" :model="form" label-width="140px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="队伍名称" prop="TEAM_NAME">
<el-input v-model="form.TEAM_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍类别" prop="TEAM_CATEGORY">
<el-select v-model="form.TEAM_CATEGORY">
<el-option
v-for="item in teamCategoryList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍属性" prop="TEAM_PROPERTY">
<el-select v-model="form.TEAM_PROPERTY">
<el-option
v-for="item in teamAttributeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍级别" prop="TEAM_LEVEL">
<el-select v-model="form.TEAM_LEVEL">
<el-option
v-for="item in teamLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍等级" prop="TEAM_GRADE">
<el-select v-model="form.TEAM_GRADE">
<el-option
v-for="item in teamGradeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成立日期" prop="TEAM_CREATE_TIME">
<el-date-picker
v-model="form.TEAM_CREATE_TIME"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="服务区域" prop="SERVICE_PLACE">
<el-input v-model="form.SERVICE_PLACE" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="地址" prop="ADDRESS">
<el-input v-model="form.ADDRESS" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍负责人姓名" prop="TEAM_LEADER_NAME">
<el-input v-model="form.TEAM_LEADER_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="队伍负责人电话" prop="TEAM_LEADER_PHONE">
<el-input v-model="form.TEAM_LEADER_PHONE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="应急值班电话" prop="DUTY_TELEPHONE">
<el-input v-model="form.DUTY_TELEPHONE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="救援专业" prop="SPECIAL_TYPE">
<el-select v-model="form.SPECIAL_TYPE">
<el-option
v-for="item in rescueSpecialtyList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总人数" prop="TOTLE_PERSON_NUM">
<el-input v-model.number="form.TOTLE_PERSON_NUM" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指战人数" prop="COMMANDER_NUM">
<el-input v-model.number="form.COMMANDER_NUM" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="车辆数" prop="CAR_NUM">
<el-input v-model.number="form.CAR_NUM" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="后勤人数" prop="LOGISTICS_PERSON_NUM">
<el-input v-model.number="form.LOGISTICS_PERSON_NUM" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="队员信息" prop="TEAM_MEMBER_INFO">
<el-input
v-model="form.TEAM_MEMBER_INFO"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="专长描述" prop="SPECIAL_DESC">
<el-input
v-model="form.SPECIAL_DESC"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="队伍简介" prop="TEAM_DESC">
<el-input
v-model="form.TEAM_DESC"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mt-10 tc">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import { ref } from "vue";
import {
layoutFnGetRescueSpecialty,
layoutFnGetTeamAttribute,
layoutFnGetTeamCategory,
layoutFnGetTeamGrade,
layoutFnGetTeamLevel,
} from "@/assets/js/data_dictionary.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
getEmergencyRescueTeamManagementView,
setEmergencyRescueTeamManagementAdd,
setEmergencyRescueTeamManagementEdit,
} from "@/request/emergency_resource_management.js";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
const { EMERGENCYTEAM_ID } = route.query;
const rules = {
TEAM_NAME: [{ required: true, message: "队伍名称不能为空", trigger: "blur" }],
TEAM_CATEGORY: [
{ required: true, message: "请选择队伍类别", trigger: "change" },
],
TEAM_PROPERTY: [
{ required: true, message: "请选择队伍属性", trigger: "change" },
],
TEAM_LEVEL: [
{ required: true, message: "请选择队伍级别", trigger: "change" },
],
TEAM_GRADE: [
{ required: true, message: "请选择队伍等级", trigger: "change" },
],
TEAM_CREATE_TIME: [
{ required: true, message: "成立日期不能为空", trigger: "change" },
],
ADDRESS: [{ required: true, message: "地址不能为空", trigger: "blur" }],
SERVICE_PLACE: [
{ required: true, message: "服务区域不能为空", trigger: "blur" },
],
TEAM_LEADER_NAME: [
{ required: true, message: "队伍负责人姓名不能为空", trigger: "blur" },
],
TEAM_LEADER_PHONE: [
{ required: true, message: "请输入队伍负责人电话", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
message: "请输入正确的手机号码",
},
],
DUTY_TELEPHONE: [
{ required: true, message: "请输入应急值班电话", trigger: "blur" },
{
min: 11,
max: 13,
message: "请输入正确的11位手机号码或座机号(例:010-12345678)",
trigger: "blur",
},
{
pattern:
/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$|^0\d{2,3}-?\d{7,8}$/,
message: "请输入正确的11位手机号码或座机号(例:010-12345678)",
},
],
TOTLE_PERSON_NUM: [
{ required: true, message: "总人数不能为空", trigger: "change" },
{ type: "number", message: "总人数必须为数字" },
],
COMMANDER_NUM: [
{ required: true, message: "指战人数不能为空", trigger: "change" },
{ type: "number", message: "指战人数必须为数字" },
],
CAR_NUM: [
{ required: true, message: "车辆数不能为空", trigger: "change" },
{ type: "number", message: "车辆数必须为数字" },
],
LOGISTICS_PERSON_NUM: [
{ required: true, message: "后勤人数不能为空", trigger: "change" },
{ type: "number", message: "后勤人数必须为数字" },
],
TEAM_MEMBER_INFO: [
{ required: true, message: "队员信息不能为空", trigger: "blur" },
],
SPECIAL_TYPE: [
{ required: true, message: "请选择救援专业", trigger: "change" },
],
SPECIAL_DESC: [
{ required: true, message: "专长描述不能为空", trigger: "blur" },
],
TEAM_DESC: [{ required: true, message: "队伍简介不能为空", trigger: "blur" }],
};
const form = ref({
TEAM_NAME: "",
TEAM_CATEGORY: "",
TEAM_PROPERTY: "",
TEAM_LEVEL: "",
TEAM_GRADE: "",
TEAM_CREATE_TIME: "",
ADDRESS: "",
SERVICE_PLACE: "",
TEAM_LEADER_NAME: "",
TEAM_LEADER_PHONE: "",
DUTY_TELEPHONE: "",
TOTLE_PERSON_NUM: "",
COMMANDER_NUM: "",
CAR_NUM: "",
LOGISTICS_PERSON_NUM: "",
TEAM_MEMBER_INFO: "",
SPECIAL_TYPE: "",
SPECIAL_DESC: "",
TEAM_DESC: "",
});
const formRef = ref(null);
const fnGetData = async () => {
if (!EMERGENCYTEAM_ID) return;
const resData = await getEmergencyRescueTeamManagementView({
EMERGENCYTEAM_ID,
});
form.value = resData.pd;
};
fnGetData();
const teamCategoryList = await layoutFnGetTeamCategory();
const teamAttributeList = await layoutFnGetTeamAttribute();
const teamLevelList = await layoutFnGetTeamLevel();
const teamGradeList = await layoutFnGetTeamGrade();
const rescueSpecialtyList = await layoutFnGetRescueSpecialty();
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
!EMERGENCYTEAM_ID
? await setEmergencyRescueTeamManagementAdd({ ...form.value })
: await setEmergencyRescueTeamManagementEdit({ ...form.value });
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,164 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@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-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
ref="tableRef"
v-model:pagination="pagination"
row-key="EMERGENCYTEAM_ID"
:data="list"
@get-data="fnGetData"
>
<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="TEAM_NAME"
label="队伍名称"
show-overflow-tooltip
/>
<el-table-column prop="TEAM_CATEGORY_NAME" label="队伍类别" />
<el-table-column prop="TEAM_PROPERTY_NAME" label="队伍属性" />
<el-table-column prop="TEAM_LEVEL_NAME" label="队伍级别" />
<el-table-column prop="TEAM_GRADE_NAME" label="队伍等级" />
<el-table-column prop="SPECIAL_TYPE_NAME" label="救援专业" />
<el-table-column prop="TEAM_LEADER_NAME" label="队伍负责人姓名" />
<el-table-column prop="TEAM_LEADER_PHONE" label="队伍负责人电话" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_rescue_team_management/view',
query: { EMERGENCYTEAM_ID: row.EMERGENCYTEAM_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/emergency_resource_management/emergency_rescue_team_management/edit',
query: { EMERGENCYTEAM_ID: row.EMERGENCYTEAM_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.EMERGENCYTEAM_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/emergency_resource_management/emergency_rescue_team_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import {
getEmergencyRescueTeamManagementList,
setEmergencyRescueTeamManagementDelete,
setEmergencyRescueTeamManagementDeleteMultiple,
} from "@/request/emergency_resource_management.js";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, searchForm, pagination, fnGetData, fnResetPagination, tableRef } =
useListData(getEmergencyRescueTeamManagementList);
const buttonJurisdiction = await useButtonJurisdiction("emergencyteam");
const fnDelete = debounce(
1000,
async (EMERGENCYTEAM_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyRescueTeamManagementDelete({ EMERGENCYTEAM_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
const DATA_IDS = selectionData
.map((item) => item.EMERGENCYTEAM_ID)
.join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setEmergencyRescueTeamManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

Some files were not shown because too many files have changed in this diff Show More