Browse Source

250116

main
wxc 11 months ago
parent
commit
a9f8ac4b70
  1. 8
      src/api/auth.ts
  2. 7
      src/api/sensitivePerception/model.ts
  3. 31
      src/components/model-icon-picker.vue
  4. 86
      src/components/negative/verify.vue
  5. 5
      src/stores/modules/catch.ts
  6. 17
      src/stores/modules/user.ts
  7. 69
      src/views/Login.vue
  8. 99
      src/views/data/Mail12337.vue
  9. 389
      src/views/sensitivePerception/Model.vue
  10. 12
      src/views/sensitivePerception/RiskPersonnel.vue
  11. 38
      src/views/system/DepartMaping.vue
  12. 2
      src/views/work/Alarm.vue
  13. 20
      src/views/work/BatchDistribute.vue
  14. 23
      src/views/work/Done.vue
  15. 2
      src/views/work/Fav.vue
  16. 13
      src/views/work/Query.vue
  17. 19
      src/views/work/Todo.vue
  18. 18
      src/views/work/VerifySubmit.vue

8
src/api/auth.ts

@ -19,3 +19,11 @@ export function getSelf(body) {
body
});
}
export function jitRandom() {
return request.get({ url: '/jit/random' })
}
// 数字证书登录
export function jitLogin(body) {
return request.post({ url: '/jit/p7certAuth', body })
}

7
src/api/sensitivePerception/model.ts

@ -38,3 +38,10 @@ export function delModel(id) {
url: `/models/${id}`
});
}
export function listClueMappingData() {
return request.get({
url: `/models/clueMappingData/list`
});
}

31
src/components/model-icon-picker.vue

@ -7,7 +7,7 @@
@click="handleChangeColorClick(item)"
:active="item === activeColor"
>
<div class="color-item" :style="{background: item}"></div>
<div class="color-item" :style="{ background: item }"></div>
</div>
</div>
<div class="flex gap wrap">
@ -18,13 +18,15 @@
@click="handleClick(item)"
:active="item === activeIcon"
>
<div class="icon" :style="{background: activeColor}">
<div class="icon" :style="{ background: activeColor }">
<icon :name="item" :size="36" />
</div>
</div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
const props = defineProps({
color: {
type: String,
@ -54,14 +56,26 @@ for (let i = 1; i <= 19; i++) {
const activeIcon = ref(props.ico);
watch(() => props.ico, (val) => {
activeIcon.value = val
})
watch(
() => props.ico,
(val) => {
activeIcon.value = val;
}
);
const activeColor = ref(
props.color || "linear-gradient( 180deg, #3A7DDB 0%, #2731DB 100%)"
);
onMounted(() => {
if (!props.color) {
emit("update:color", activeColor.value);
}
});
const activeColor = ref(props.color || 'linear-gradient( 180deg, #3A7DDB 0%, #2731DB 100%)')
function handleChangeColorClick(item) {
activeColor.value = item;
emit("update:color", activeColor.value)
emit("update:color", activeColor.value);
}
function handleClick(item) {
@ -78,7 +92,8 @@ function handleClick(item) {
width: 40px;
border-radius: 8px;
}
&:hover, &[active="true"] {
&:hover,
&[active="true"] {
cursor: pointer;
background: #dce4ff;
border-color: #4759d9;

86
src/components/negative/verify.vue

@ -67,7 +67,10 @@
message: '请选择是否整改',
trigger: ['blur'],
}"
v-if="form.checkStatus !== InspectCase.FALSE && form.checkStatus !== InspectCase.UNABLE"
v-if="
form.checkStatus !== InspectCase.FALSE &&
form.checkStatus !== InspectCase.UNABLE
"
>
<el-radio-group
v-model="form.isRectifyCode"
@ -89,7 +92,10 @@
</el-col>
<el-col
:span="12"
v-if="negative.problemSourcesCode !== ProblemSources.JWDC && form.checkStatus !== InspectCase.UNABLE"
v-if="
negative.problemSourcesCode !== ProblemSources.JWDC &&
form.checkStatus !== InspectCase.UNABLE
"
>
<el-form-item
label="涉及对象"
@ -114,7 +120,8 @@
:span="12"
v-if="
form.checkStatus !== InspectCase.FALSE &&
form.isRectifyCode === IsRectify.NOT && form.checkStatus !== InspectCase.UNABLE
form.isRectifyCode === IsRectify.NOT &&
form.checkStatus !== InspectCase.UNABLE
"
>
<el-form-item
@ -156,7 +163,10 @@
message: '请输入未整改原因',
trigger: ['blur'],
}"
v-if="(form.isRectifyCode === '0' || form.isRectifyCode === '2') && form.checkStatus !== InspectCase.UNABLE"
v-if="
(form.isRectifyCode === '0' || form.isRectifyCode === '2') &&
form.checkStatus !== InspectCase.UNABLE
"
>
<el-input
type="textarea"
@ -1272,6 +1282,61 @@
</div>
</el-form-item>
</template>
<el-form-item
prop="handlePolices"
label="经办人"
:rules="{
required: true,
validator: validateHandlePolices,
}"
v-if="
negative.problemSourcesCode === ProblemSources.GJXFPT ||
negative.problemSourcesCode === ProblemSources.GABXF ||
negative.problemSourcesCode === ProblemSources.JZXX ||
negative.problemSourcesCode === ProblemSources.XF12337
"
>
<div>
<div
class="mb-8 flex gap v-center"
v-for="(item, index) in form.handlePolices"
:key="index"
>
<police-select
:depart-id="negative.handleSecondDepartId"
v-model="item.empNo"
@change="
(police) => {
item.name = police.name;
item.idCode = police.idCode;
}
"
/>
<el-button
plain
type="primary"
v-if="index === 0"
@click="form.handlePolices.push({})"
>
<template #icon>
<icon name="el-icon-Plus" />
</template>
添加经办人
</el-button>
<el-button
plain
type="danger"
v-else
@click="form.handlePolices.splice(index, 1)"
>
<template #icon>
<icon name="el-icon-Delete" />
</template>
删除经办人
</el-button>
</div>
</div>
</el-form-item>
<el-form-item
prop="files"
label-position="top"
@ -1358,7 +1423,9 @@ const dict = catchSotre.getDicts([
]);
const negative = inject("negative");
const form = ref({});
const form = ref({
handlePolices: [{}],
});
getFormData();
@ -1381,6 +1448,7 @@ function getFormData() {
blames: negative.value.blames,
blameLeaders: negative.value.blameLeaders,
files: negative.value.files || [],
handlePolices: negative.value.handlePolices || [{}],
};
if (negative.value.accountabilityTarget != undefined) {
form.value.accountabilityTarget = negative.value.accountabilityTarget;
@ -1524,6 +1592,14 @@ function handleCheckboxChange(blameLeader, bool, val) {
}
}
function validateHandlePolices(rule, value, cb) {
if (value.length === 0) {
cb(new Error("请选择经办人"));
} else {
cb();
}
}
const formRef = ref(null);
async function validate() {

5
src/stores/modules/catch.ts

@ -15,7 +15,7 @@ export interface CatchState {
// 判定是否已请求缓存
let departCatchFlag = true;
let departAllCatchFlag = true;
let dictContentFlag = true;
const dictCatchFlag = {};
let dictProblemSourcesFlag = true;
@ -56,7 +56,8 @@ const useCatchStore = defineStore({
return this.dict[key]
},
getDictContent() {
if (!this.dictContent.length) {
if (!this.dictContent.length && dictContentFlag) {
dictContentFlag = false
const refresh = async () => {
const res = await Promise.allSettled<Promise<any>>([listDictContentTree()])
res.forEach((item) => {

17
src/stores/modules/user.ts

@ -1,6 +1,6 @@
import type { RouteRecordRaw } from 'vue-router'
import { defineStore } from 'pinia'
import { login, getSelf } from '@/api/auth'
import { login, getSelf, jitRandom, jitLogin } from '@/api/auth'
import { createRouteRecord } from '@/router'
import { setToken } from '@/utils/token'
@ -36,6 +36,21 @@ const useUserStore = defineStore({
})
})
},
// 数字证书登录
async loginBySzzs() {
const random = await jitRandom();
console.log(random)
return new Promise((resolve, reject) => {
jitLogin(random)
.then((data) => {
setToken(data.token)
resolve(data)
})
.catch((error) => {
reject(error)
})
})
},
getUserInfo() {
return new Promise((resolve, reject) => {
getSelf()

69
src/views/Login.vue

@ -1,7 +1,7 @@
<template>
<div class="wrapper">
<header class="text-center">
<img src="/imgs/login_header.png" alt="">
<img src="/imgs/login_header.png" alt="" />
</header>
<div class="box flex v-center">
<div class="left text-center">
@ -24,7 +24,11 @@
style="--el-input-height: 50px"
>
<template #prefix>
<icon name="el-icon-UserFilled" :size="33" color="#c0c5e2" />
<icon
name="el-icon-UserFilled"
:size="33"
color="#c0c5e2"
/>
</template>
</el-input>
</el-form-item>
@ -44,7 +48,7 @@
</el-input>
</el-form-item>
<div class="err-msg">{{ errMsg }}</div>
<div class="mt-10 mb-20">
<div class="mt-8 mb-8">
<el-button
type="primary"
size="large"
@ -55,7 +59,21 @@
--el-button-size: 54px;
--el-font-size-base: 18px;
"
>登录</el-button>
>登录</el-button
>
</div>
<div class="mt-10 mb-20">
<el-button
size="large"
:loading="isLock"
style="
width: 100%;
--el-button-size: 54px;
--el-font-size-base: 18px;
"
@click="szzsLogin"
>数字证书登录</el-button
>
</div>
</el-form>
</div>
@ -63,10 +81,10 @@
</div>
</template>
<script setup>
import useUserStore from '@/stores/modules/user'
import useUserStore from "@/stores/modules/user";
const formData = reactive({})
const formRef = ref(null)
const formData = reactive({});
const formRef = ref(null);
const rules = {
account: [
{
@ -83,23 +101,38 @@ const rules = {
},
],
};
const isLock = ref(false)
const isLock = ref(false);
const userStore = useUserStore()
const router = useRouter()
const errMsg = ref('')
const userStore = useUserStore();
const router = useRouter();
const errMsg = ref("");
function handleLogin() {
formRef.value.validate((flag) => {
if (flag) {
isLock.value = true
userStore.login(formData).then(() => {
router.push('/home')
}).catch((err) => {
isLock.value = false
errMsg.value = err.message
isLock.value = true;
userStore
.login(formData)
.then(() => {
router.push("/home");
})
.catch((err) => {
isLock.value = false;
errMsg.value = err.message;
});
}
});
}
async function szzsLogin() {
console.log('szzsLogin')
try {
isLock.value = true;
await userStore.loginBySzzs();
router.push("/home");
} catch (err) {
isLock.value = false;
errMsg.value = err.message;
}
})
}
</script>
<style lang="scss" scoped>

99
src/views/data/Mail12337.vue

@ -86,7 +86,11 @@
show-overflow-tooltip
width="180"
/>
<el-table-column label="投诉渠道" prop="letterSource" width="120" />
<el-table-column
label="投诉渠道"
prop="letterSource"
width="120"
/>
<el-table-column
label="登记时间"
@ -149,7 +153,12 @@
</div>
</div>
<el-dialog v-model="importShow" title="12337信访投诉导入" width="80vw" top="8vh">
<el-dialog
v-model="importShow"
title="12337信访投诉导入"
width="80vw"
top="8vh"
>
<header class="flex center mb-40">
<el-steps
:space="200"
@ -199,9 +208,7 @@
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData" max-height="500px">
<el-table-column
width="180"
>
<el-table-column width="180">
<template #header>
<span class="text-danger">核查办理单位*</span>
</template>
@ -229,7 +236,9 @@
width="170"
>
<template #header>
<span class="text-danger">信息受理登记时间*</span>
<span class="text-danger"
>信息受理登记时间*</span
>
</template>
</el-table-column>
<el-table-column
@ -264,7 +273,9 @@
width="250"
>
<template #header>
<span class="text-danger">涉嫌违纪违法事项*</span>
<span class="text-danger"
>涉嫌违纪违法事项*</span
>
</template>
</el-table-column>
<el-table-column
@ -372,10 +383,17 @@
/>
</el-table>
</div>
<div class="text-danger text-wrap mt-10 text-small">{{ errMsg }}</div>
<div class="text-danger text-wrap mt-10 text-small">
{{ errMsg }}
</div>
</template>
<template v-if="activeStep === 2">
<el-form :model="formData" ref="formRef" style="margin: 0 80px" v-loading="loading">
<el-form
:model="formData"
ref="formRef"
style="margin: 0 80px"
v-loading="loading"
>
<el-form-item
label="任务名称"
prop="taskName"
@ -437,6 +455,26 @@
"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group v-model="formData.distributionFlow">
<el-radio
v-for="item in dict.distributionFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"
@ -473,21 +511,30 @@
</el-form>
</template>
<template v-if="activeStep === 3">
<el-result
icon="success"
title="下发成功"
>
<el-result icon="success" title="下发成功">
<template #sub-title>
<p>
<span>{{ formData.taskName }}</span>
已成功导入系统并完成下发您可通过<span class="link pointer" @click="router.push('/work/BatchDistribute')">批量下发</span> <span class="link pointer" @click="router.push('/query')">综合查询</span>功能进行查看
已成功导入系统并完成下发您可通过<span
class="link pointer"
@click="router.push('/work/BatchDistribute')"
>批量下发</span
>
<span
class="link pointer"
@click="router.push('/query')"
>综合查询</span
>功能进行查看
</p>
</template>
</el-result>
</template>
</div>
<footer class="flex end mt-20 v-center">
<el-button size="large" @click="handlePrev" v-if="activeStep !== 3 && activeStep !== 0"
<el-button
size="large"
@click="handlePrev"
v-if="activeStep !== 3 && activeStep !== 0"
>上一步</el-button
>
<el-button
@ -525,7 +572,7 @@ const dict = catchStore.getDicts([
"businessType",
]);
const router = useRouter()
const router = useRouter();
const query = ref({
size: 10,
@ -577,7 +624,7 @@ function handlePrev() {
activeStep.value = activeStep.value - 1;
}
const errMsg = ref('')
const errMsg = ref("");
async function handleNext() {
if (activeStep.value === 0) {
if (fileList.value.length === 0) {
@ -605,28 +652,28 @@ async function handleNext() {
throw e;
}
});
errMsg.value = ''
const error = []
errMsg.value = "";
const error = [];
for (let i = 0; i < importTableData.value.length; i++) {
const item = importTableData.value[i];
let message = ''
let message = "";
if (!item.departId) {
message += '核查办理单位为空;'
message += "核查办理单位为空;";
}
if (!item.discoverTime) {
message += '信息受理登记时间为空;'
message += "信息受理登记时间为空;";
}
if (!item.wjwfProject) {
message += '涉嫌违纪违法事项为空;'
message += "涉嫌违纪违法事项为空;";
}
if (message) {
error.push(`${i + 1}条数据:` + message)
error.push(`${i + 1}条数据:` + message);
}
}
if (error.length > 0) {
feedback.msgWarning("数据不符合规范!");
errMsg.value = error.join('\n')
throw new Error('数据不符合规范!');
errMsg.value = error.join("\n");
throw new Error("数据不符合规范!");
}
activeStep.value = 2;
formData.value.taskName =

389
src/views/sensitivePerception/Model.vue

@ -149,7 +149,7 @@
v-model="show"
top="4vh"
>
<el-form label-width="120" ref="formRef" :model="form">
<el-form label-width="130" ref="formRef" :model="form">
<el-form-item
label="模型名称"
prop="modelName"
@ -210,6 +210,261 @@
/>
</el-select>
</el-form-item>
<template v-if="form.modelingMethod === '2'">
<el-form-item
label="模型结果表"
prop="clueTableName"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
v-model="form.clueTableName"
style="width: 340px"
@change="handleSelectClueTableName"
>
<el-option
v-for="item in clueMappingData"
:key="item.tableName"
:label="item.tableName"
:value="item.tableName"
/>
</el-select>
</el-form-item>
<el-form-item
label="结果字段映射"
:rules="{
required: true,
message: '请选择',
}"
>
<el-row :gutter="10" style="width: 100%">
<el-col :span="11">
<div class="field-table-title">
数据督察预警问题表
</div>
<el-table size="small" :data="modelClueColumns">
<el-table-column
label="字段名"
prop="fieldName"
width="150"
>
<template #default="{ row }">
<div
:class="
row.required
? 'text-danger'
: ''
"
>
{{ row.fieldName }}
</div>
</template>
</el-table-column>
<el-table-column
label="字段类型"
prop="fieldType"
width="80"
align="center"
/>
<el-table-column
label="描述"
prop="fieldDesc"
show-overflow-tooltip
/>
</el-table>
</el-col>
<el-col :span="2">
<div
style="margin-top: 104px"
class="text-center field-arrow"
>
</div>
<div class="text-center field-arrow text-danger">
</div>
<div class="text-center field-arrow"></div>
<div class="text-center field-arrow"></div>
<div class="text-center field-arrow"></div>
</el-col>
<el-col :span="11">
<div class="field-table-title">模型结果表</div>
<el-table
size="small"
:data="modelClueTargetColumns"
class="field-table_target"
>
<el-table-column label="字段名" width="150">
<template #default="{ row }">
<el-select
size="small"
v-model="row.columnName"
@change="
(val) =>
handleChangeColumn(val, row)
"
>
<el-option
v-for="item in fields"
:key="item.columnName"
:value="item.columnName"
:disabled="
modelClueTargetColumns.filter(
(field) =>
field.columnName ===
item.columnName
).length > 0
"
>
<span class="text-small">{{
item.columnName
}}</span>
<span
v-if="item.columnComment"
class="text-small"
>-</span
>
<span class="text-small">{{
item.columnComment
}}</span>
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column
label="字段类型"
prop="dataType"
width="80"
align="center"
/>
<el-table-column
label="描述"
prop="columnComment"
show-overflow-tooltip
/>
</el-table>
</el-col>
</el-row>
</el-form-item>
<el-form-item
label="同步唯一字段名"
prop="clueUniqueFieldName"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
style="width: 340px"
v-model="form.clueUniqueFieldName"
>
<el-option
v-for="item in fields"
:key="item.columnName"
:value="item.columnName"
>
<span class="text-small">{{
item.columnName
}}</span>
<span v-if="item.columnComment" class="text-small"
>-</span
>
<span class="text-small">{{
item.columnComment
}}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="预警内容生成器"
prop="thingDescGeneration"
:rules="{
required: true,
message: '请输入',
}"
>
<el-input
v-model="form.thingDescGeneration"
clearable
type="textarea"
/>
</el-form-item>
<el-form-item
label="同步周期"
prop="clueCycle"
:rules="{
required: true,
message: '请选择同步周期',
}"
>
<el-radio-group v-model="form.clueCycle" class="block">
<el-radio
v-for="item in dict.distributionCycle"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}</el-radio
>
</el-radio-group>
<!-- <div class="flex ml-20" v-if="form.clueCycle">
<el-form-item
label="周"
prop="clueCycleDayOfWeek"
label-width="80"
:rules="{
required: true,
message: '请选择',
}"
v-if="form.clueCycle === DistributionCycle.WEEKLY"
>
<el-select
style="width: 120px"
clearable
v-model="form.clueCycleDayOfWeek"
>
<el-option value="MON">周一</el-option>
<el-option value="TUE">周二</el-option>
<el-option value="WED">周三</el-option>
<el-option value="THU">周四</el-option>
<el-option value="FRI">周五</el-option>
<el-option value="SAT">周六</el-option>
<el-option value="SUN">周日</el-option>
</el-select>
</el-form-item>
</div> -->
</el-form-item>
<el-form-item
label="机构映射"
prop="clueDepartSource"
:rules="{
required: true,
message: '请选择机构映射',
}"
>
<div class="flex gap">
<el-select
style="width: 340px"
v-model="form.clueDepartSource"
clearable
>
<el-option
v-for="item in dict.departMappingSource"
:key="item.dictCode"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
<el-button
type="primary"
plain
@click="router.push('/system/dict')"
>创建机构映射</el-button
>
</div>
</el-form-item>
</template>
<el-form-item
label="模型分类"
prop="modelType"
@ -240,7 +495,9 @@
>
<el-select v-model="form.classId" style="width: 340px">
<el-option
v-for="item in classes.filter(item => item.modelType === form.modelType)"
v-for="item in classes.filter(
(item) => item.modelType === form.modelType
)"
:key="item.id"
:label="item.name"
:value="item.id"
@ -564,6 +821,7 @@
style="width: 100px"
type="number"
v-model="form.replyLimit"
:min="1"
/><span></span>
</div>
</el-form-item>
@ -630,7 +888,13 @@
</footer>
</el-dialog>
<el-dialog title="模型详情" v-model="detailShow" top="5vh" width="70vw" style="margin-bottom: 2vh">
<el-dialog
title="模型详情"
v-model="detailShow"
top="5vh"
width="1100"
style="margin-bottom: 2vh"
>
<header class="model-info-header" style="">
<el-row :gutter="40">
<el-col :span="2">
@ -676,11 +940,13 @@
</div>
<div class="col col-6">
<label>预警类型</label>
<span>{{ form.modelDataType === "1"
<span>{{
form.modelDataType === "1"
? form.modelType === "1"
? "预警问题"
: "预警处置"
: "提醒通知" }}</span>
: "提醒通知"
}}</span>
</div>
<div class="col col-6">
<label>分发方式</label>
@ -735,6 +1001,20 @@
</div>
</div>
</div>
<div class="row">
<div class="col col-6" v-if="activeModel.clueTableName">
<label>模型结果表</label>
<span>{{ activeModel.clueTableName }}</span>
</div>
<div class="col col-6" v-if="activeModel.clueTimeFieldName">
<label>同步时间字段名</label>
<span>{{ activeModel.clueTimeFieldName }}</span>
</div>
<div class="col col-6" v-if="activeModel.clueUniqueFieldName">
<label>同步唯一字段名</label>
<span>{{ activeModel.clueUniqueFieldName }}</span>
</div>
</div>
<el-divider />
<div class="flex end mb-20">
@ -856,7 +1136,8 @@ import {
addModel,
updateModel,
delModel,
listModel
listModel,
listClueMappingData,
} from "@/api/sensitivePerception/model";
import { listModelClue } from "@/api/sensitivePerception/modelClue";
import { listTopModelClueRecords } from "@/api/sensitivePerception/modelClue";
@ -877,6 +1158,7 @@ const dict = catchStore.getDicts([
"suspectProblem",
"policeType",
"modelType",
"departMappingSource",
]);
//
@ -923,10 +1205,13 @@ function handleChangeClass(id) {
query.value.classId = id;
}
watch(() => query.value.classId, () => {
query.value.current = 1
watch(
() => query.value.classId,
() => {
query.value.current = 1;
getList();
})
}
);
const show = ref(false);
const mode = ref("add");
@ -951,9 +1236,11 @@ function initForm() {
}
const formRef = ref(null);
function handleAdd() {
const clueMappingData = ref([]);
async function handleAdd() {
show.value = true;
mode.value = "add";
clueMappingData.value = await listClueMappingData();
}
function handleEdit() {
@ -961,11 +1248,10 @@ function handleEdit() {
mode.value = "edit";
form.value = { ...activeModel.value };
if (activeModel.value.involveProblem) {
form.value.involveProblem = activeModel.value.involveProblem.split(',')
form.value.involveProblem = activeModel.value.involveProblem.split(",");
} else {
form.value.involveProblem = [];
}
}
function handleAddProblem() {
@ -977,6 +1263,20 @@ function handleRemoveProblem(index) {
}
async function handleSubmit() {
if (form.value.modelingMethod === "2") {
if (!modelClueTargetColumns.value[1].columnName
) {
feedback.msgWarning("请选择结果字段映射【红色为必填】");
return;
}
form.value.modelGeneration = {
involveDepartName: modelClueTargetColumns.value[0].columnName,
involveDepartId: modelClueTargetColumns.value[1].columnName,
involvePoliceName: modelClueTargetColumns.value[2].columnName,
involvePoliceEmpNo: modelClueTargetColumns.value[3].columnName,
happenTime: modelClueTargetColumns.value[4].columnName,
};
}
await formRef.value.validate();
if (mode.value === "add") {
await addModel(form.value);
@ -1016,7 +1316,6 @@ async function handleDetailConfigShow() {
size: 1,
});
if (data.records.length && data.records[0].data) {
} else {
modelClueData.value = JSON.parse(data.records[0].data);
}
@ -1040,6 +1339,52 @@ function goClue() {
});
}
}
const modelClueColumns = [
{
fieldName: "involvo_depart_name",
fieldType: "varchar",
fieldDesc: "涉及单位名称"
},
{
fieldName: "involvo_depart_id",
fieldType: "varchar",
fieldDesc: "涉及单位ID",
required: true,
},
{
fieldName: "involvo_police_name",
fieldType: "varchar",
fieldDesc: "涉及人员姓名",
},
{
fieldName: "involvo_police_emp_no",
fieldType: "varchar",
fieldDesc: "涉及人员警号",
},
{
fieldName: "happen_time",
fieldType: "varchar",
fieldDesc: "发生时间",
},
];
function handleChangeColumn(val, row) {
const item = fields.value.find((item) => item.columnName === val);
row.dataType = item.dataType;
row.columnComment = item.columnComment;
}
const modelClueTargetColumns = ref([{}, {}, {}, {}, {}]);
const fields = ref([]);
function handleSelectClueTableName(val) {
if (val) {
fields.value = clueMappingData.value.filter(
(item) => item.tableName === val
)[0].fields;
}
}
</script>
<style lang="scss" scoped>
.menu {
@ -1080,4 +1425,22 @@ function goClue() {
box-shadow: 0px 2px 4px 0px rgba(133, 150, 248, 0.47);
padding: 28px;
}
.field-table-title {
font-weight: 700;
color: var(--primary-color);
margin-bottom: 8px;
font-size: 15px;
}
.field-arrow {
height: 32px;
line-height: 32px;
width: 100%;
}
.field-table_target {
:deep() {
.el-table--small .el-table__cell {
padding: 2px 0;
}
}
}
</style>

12
src/views/sensitivePerception/RiskPersonnel.vue

@ -181,7 +181,7 @@
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
@ -387,7 +387,10 @@ import { alarmNotificationCommit } from "~/api/work/alarm";
import feedback from "~/utils/feedback";
import { listPoliceAll } from "~/api/system/police";
const query = ref({});
const query = ref({
current: 1,
size: 10,
});
const list = ref<any[]>([]);
const total = ref(0);
const show = ref(false);
@ -410,7 +413,10 @@ function getList() {
}
function reset() {
query.value = {};
query.value = {
current: 1,
size: 10,
};
getList();
}

38
src/views/system/DepartMaping.vue

@ -2,10 +2,10 @@
<div class="container">
<el-tabs v-model="activeName" type="card">
<el-tab-pane
v-for="item in sources"
v-for="item in dict.departMappingSource"
:key="item"
:label="item.label"
:name="item.value"
:label="item.dictLabel"
:name="item.dictValue"
>
</el-tab-pane>
</el-tabs>
@ -166,10 +166,10 @@
style="width: 280px"
>
<el-option
v-for="item in sources"
v-for="item in dict.departMappingSource"
:key="item"
:label="item.label"
:value="item.value"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
@ -225,6 +225,7 @@
</el-dialog>
</template>
<script setup>
import {
listDepartMaping,
addDepartMaping,
@ -232,27 +233,14 @@ import {
delDepartMaping,
} from "@/api/system/departMaping";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
const sources = [
{
value: "情指行",
label: "情指行",
},
{
value: "重点人员",
label: "重点人员",
},
{
value: "民意感知",
label: "民意感知",
},
{
value: "局长信箱",
label: "局长信箱",
},
];
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"departMappingSource"
]);
const activeName = ref(sources[0].value);
const activeName = ref('情指行');
const query = ref({
current: 1,
size: 10,

2
src/views/work/Alarm.vue

@ -125,7 +125,7 @@
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"

20
src/views/work/BatchDistribute.vue

@ -251,6 +251,26 @@
"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group v-model="formData.distributionFlow">
<el-radio
v-for="item in dict.distributionFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"

23
src/views/work/Done.vue

@ -34,6 +34,12 @@
clearable
style="width: 200px"
/>
<el-input
placeholder="涉及案件 / 警情编号"
v-model="query.caseNumber"
clearable
style="width: 200px"
/>
<el-input
placeholder="事情简要描述"
v-model="query.thingDesc"
@ -84,17 +90,18 @@
v-model="query.reportNumber"
clearable
/>
<div style="width: 180px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
</div>
</div>
<div class="form-row flex">
<label class="text-center">核查情况</label>
<div class="flex wrap query-box">
<div style="width: 200px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
<div style="width: 200px">
<depart-tree-select
v-model="query.handleDepartId"
@ -368,7 +375,7 @@
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
@ -399,7 +406,7 @@ const loading = ref(true)
function getList() {
loading.value = true
listDones().then(data => {
listDones(query.value).then(data => {
dones.value = data.records
total.value = data.total
loading.value = false

2
src/views/work/Fav.vue

@ -211,7 +211,7 @@ const query = ref({
const total = ref(0);
function getList() {
listFav().then((data) => {
listFav(query.value).then((data) => {
favs.value = data.records;
total.value = data.total;
});

13
src/views/work/Query.vue

@ -90,17 +90,18 @@
v-model="query.reportNumber"
clearable
/>
<div style="width: 180px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
</div>
</div>
<div class="form-row flex">
<label class="text-center">核查情况</label>
<div class="flex wrap query-box">
<div style="width: 200px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
<div style="width: 200px">
<depart-tree-select
v-model="query.handleDepartId"

19
src/views/work/Todo.vue

@ -34,6 +34,12 @@
clearable
style="width: 200px"
/>
<el-input
placeholder="涉及案件 / 警情编号"
v-model="query.caseNumber"
clearable
style="width: 200px"
/>
<el-input
placeholder="事情简要描述"
v-model="query.thingDesc"
@ -84,17 +90,18 @@
v-model="query.reportNumber"
clearable
/>
<div style="width: 180px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
</div>
</div>
<div class="form-row flex">
<label class="text-center">核查情况</label>
<div class="flex wrap query-box">
<div style="width: 200px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
<div style="width: 200px">
<depart-tree-select
v-model="query.handleDepartId"

18
src/views/work/VerifySubmit.vue

@ -1,7 +1,7 @@
<template>
<div class="wrapper">
<div class="container" v-loading="loading">
<template v-if="step === 0">
<template v-if="step === 0 && !errorFlag">
<div class="message flex gap">
<icon
name="el-icon-WarningFilled"
@ -1486,6 +1486,13 @@
>
</footer>
</template>
<template v-else-if="errorFlag">
<el-result
icon="error"
title="错误"
:sub-title="errMsg"
></el-result>
</template>
<template v-else>
<el-result
icon="success"
@ -1546,9 +1553,18 @@ const form = ref({
provide("negative", negative);
const errorFlag = ref(false)
const errMsg = ref('')
async function getDetails() {
loading.value = true;
try {
const data = await getNegativeDetailsByOuter(id);
} catch(e) {
loading.value = false;
errorFlag.value = true
errMsg.value = e.message
return
}
negative.value = data.negative;
loading.value = false;
}

Loading…
Cancel
Save