Browse Source

fix. 修复修改核查内容 涉及单位修改不生效的问题。

fix 修复单位会签,当连续会签时会保留上一个件会签的记录的问题。

fit. 模型超市-模型分类,增加模型数量显示。
fit. 问题下发,新增是否开启流程选项。如果选择关闭流程,问题下发后对应办理单位无待办任务;
perf. 问题下发调整: a、枪支管理:监督管理-专项督察-选择“枪支管理”取消“通报期数”的必填项 b、主办层级描述修改,并将标红后半句:如主办层级为 市局主办,则由督察支队办理;如主办层级为 二级机构主办,则由督察部门办理,可进一步下发;如主办层级为 三级机构主办,则由所队办理。 c、指定具体办理单位 修改为 “指定办理单位” d、主办层级与指定办理单位需灵活关联,a.如“主办层级”选择二级主办,关联办理单位为三级机构,需友好提示“当前选择二级机构主办,指定办理单位请选择二级机构!”b.需根据主办层级的修改,关联办理单位可选择的范围,并提示。
main
wxc 12 months ago
parent
commit
fdcf5530a0
  1. 57
      src/components/file/list.vue
  2. 15
      src/components/model-risk-tree.vue
  3. 282
      src/components/negative/add.vue
  4. 8
      src/components/negative/apply-countersign.vue
  5. 6
      src/components/negative/countersign.vue
  6. 4
      src/views/sensitivePerception/Model.vue
  7. 2
      src/views/sensitivePerception/RiskPersonnel.vue
  8. 15
      src/views/system/Police.vue

57
src/components/file/list.vue

@ -26,23 +26,22 @@
</a> </a>
</template> </template>
<template v-else> <div
<div class="item flex end v-center column text-center"
class="item flex end v-center column text-center" :title="item.fileName"
:title="item.fileName" @click="filePreview(item)"
@click="filePreview(item)" v-else
>
<icon :name="getIconName(item.fileName)" :size="40" />
<span class="filename">{{ item.fileName }}</span>
<a
class="remove-btn"
@click.stop="remove(index)"
v-if="removeEnable"
> >
<icon :name="getIconName(item.fileName)" :size="40" /> <icon name="el-icon-CircleCloseFilled" :size="16" />
<span class="filename">{{ item.fileName }}</span> </a>
<a </div>
class="remove-btn"
@click.stop="remove(index)"
v-if="removeEnable"
>
<icon name="el-icon-CircleCloseFilled" :size="16" />
</a>
</div>
</template>
</div> </div>
</div> </div>
@ -61,10 +60,7 @@
</section> </section>
</div> </div>
</el-scrollbar> </el-scrollbar>
<div <div class="file-content flex center v-center" @click="preview = false">
class="file-content flex center v-center"
@click="preview = false"
>
<div <div
class="img-container flex center" class="img-container flex center"
v-if="getFileType(activeFile.fileName) === FileType.IMG" v-if="getFileType(activeFile.fileName) === FileType.IMG"
@ -128,9 +124,7 @@
</video> </video>
</template> </template>
<template <template
v-else-if=" v-else-if="getFileType(activeFile.fileName) === FileType.WORD"
getFileType(activeFile.fileName) === FileType.WORD
"
> >
<vue-office-docx <vue-office-docx
:src="`${BASE_PATH}/file/stream/${activeFile.filePath}`" :src="`${BASE_PATH}/file/stream/${activeFile.filePath}`"
@ -174,7 +168,13 @@
@click.stop @click.stop
> >
<template #extra> <template #extra>
<el-button type="primary" text size="large" @click="download">下载文件</el-button> <el-button
type="primary"
text
size="large"
@click="download"
>下载文件</el-button
>
</template> </template>
</el-result> </el-result>
</div> </div>
@ -205,12 +205,7 @@
<icon name="el-icon-Close" :size="28" /> <icon name="el-icon-Close" :size="28" />
</button> </button>
<el-button <el-button class="download-btn" @click="download" type="primary" plain>
class="download-btn"
@click="download"
type="primary"
plain
>
<template #icon> <template #icon>
<icon name="el-icon-Download" :size="20" /> <icon name="el-icon-Download" :size="20" />
</template> </template>
@ -290,7 +285,6 @@ function next() {
} }
} }
function wheel(event) { function wheel(event) {
if (event.deltaY > 0 && scale.value > 0.5) { if (event.deltaY > 0 && scale.value > 0.5) {
scale.value -= 0.1; scale.value -= 0.1;
@ -348,7 +342,6 @@ function rotateRight() {
rotate.value -= 90; rotate.value -= 90;
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.file-container { .file-container {

15
src/components/model-risk-tree.vue

@ -13,7 +13,7 @@
:default-expanded-keys="[ROOT_ID]" :default-expanded-keys="[ROOT_ID]"
:props="{ :props="{
label: 'riskName', label: 'riskName',
value: 'id' value: 'id',
}" }"
:filter-node-method="filterNode" :filter-node-method="filterNode"
@node-click="handleClick" @node-click="handleClick"
@ -24,9 +24,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import Icon from "@/components/icon/index.vue"; import Icon from "@/components/icon/index.vue";
import { import { listRiskScoreRuleTree } from "@/api/sensitivePerception/riskScoreRule";
listRiskScoreRuleTree
} from "@/api/sensitivePerception/riskScoreRule";
const ROOT_ID = 0; const ROOT_ID = 0;
const treeData = ref([ const treeData = ref([
@ -41,7 +39,7 @@ const list = ref([]);
const total = ref(0); const total = ref(0);
onMounted(() => { onMounted(() => {
listRiskScoreRuleTree().then((data) => { listRiskScoreRuleTree().then((data) => {
treeData.value[0].children = data; treeData.value[0].children = data;
}); });
}); });
@ -75,16 +73,16 @@ function renderContent(
h( h(
"span", "span",
{ {
title: node.label + '('+node.ruleDesc+')', title: node.label + "(" + node.ruleDesc + ")",
}, },
node.label node.label
), ),
h( h(
"span", "span",
{ {
class: 'ml-8 text-primary' class: "ml-8 text-primary",
}, },
node.data.size ? `(${node.data.size })` : '' node.data.size ? `(${node.data.size})` : ""
) )
); );
} }
@ -126,6 +124,7 @@ function getModelId(arr, node) {
getModelId(arr, item); getModelId(arr, item);
}); });
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep() { :deep() {

282
src/components/negative/add.vue

@ -1,5 +1,5 @@
<template> <template>
<el-dialog title="问题录入" width="54vw" :lock-scroll="false" top="5vh"> <el-dialog title="问题下发" width="54vw" :lock-scroll="false" top="5vh">
<el-scrollbar <el-scrollbar
height="75vh" height="75vh"
v-loading="loading" v-loading="loading"
@ -108,8 +108,8 @@
label="通报期数" label="通报期数"
prop="reportNumber" prop="reportNumber"
:rules="{ :rules="{
required: true, required: form.specialSupervision !== '2',
message: '请选择通报期数', message: '请输入通报期数',
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
@ -293,147 +293,170 @@
tips="为便于“办理单位”更全面了解问题详情,请上传相关附件,如现场督察、数字督察等相关照片、视频及其他佐证材料。" tips="为便于“办理单位”更全面了解问题详情,请上传相关附件,如现场督察、数字督察等相关照片、视频及其他佐证材料。"
/> />
</el-form-item> </el-form-item>
</div> <el-form-item label="流程" prop="">
<h2>办理单位</h2> <el-switch
<div class="add-negation-container"> v-model="form.flowFlag"
<el-form-item inline-prompt
label="主办层级" active-text="开启"
prop="hostLevel" inactive-text="关闭"
:rules="{ :active-value="true"
required: true, :inactive-value="false"
message: '请选择主办层级',
trigger: ['blur'],
}"
>
<el-select
style="width: 280px"
v-model="form.hostLevel"
@change="handleChangeHostLevel"
>
<el-option
v-for="item in dict.hostLevel"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
<div class="tips mt-10">
<p>
如主办层级 市局主办 则由市局直属支队办理
</p>
<p>
如主办层级
二级机构主办时则由涉及单位的二级机构办理
</p>
<p>
如主办层级 三级机构主办时
则由涉及单位办理
</p>
</div>
</el-form-item>
<el-form-item
label="指定具体办理单位"
prop="departId"
:rules="{
required: true,
message: '请选择办理单位',
trigger: ['blur'],
}"
>
<div class="flex gap">
<div style="width: 280px">
<template
v-if="form.hostLevel === HostLevel.THREE"
>
<depart-tree-select
v-model="form.departId"
v-loading="departLoading"
/>
</template>
<el-tree-select
v-else
:data="departs"
:props="{ label: 'shortName', value: 'id' }"
node-key="id"
clearable
filterable
v-model="form.departId"
@node-click="handleSelectDepart"
check-strictly
style="width: 280px"
v-loading="departLoading"
/>
</div>
<el-button
type="primary"
@click="handleLinkDepart"
text
v-if="form.hostLevel !== HostLevel.FIRST"
>关联问题涉及单位</el-button
>
</div>
<div class="tips mt-10">
<p>问题涉及单位 指与该问题相关的单位</p>
<p>指定具体办理单位 指将问题分派给哪个单位办理</p>
</div>
</el-form-item>
</div>
<h2>办理时限</h2>
<div class="add-negation-container">
<el-form-item
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
trigger: ['blur'],
}"
>
<time-limit-select
v-model="form.timeLimit"
v-model:maxSignDuration="form.maxSignDuration"
v-model:maxHandleDuration="form.maxHandleDuration"
v-model:maxExtensionDuration="
form.maxExtensionDuration
"
/> />
</el-form-item> </el-form-item>
</div> </div>
<template v-if="form.flowFlag">
<div> <el-divider />
<h2>审批流程</h2> <h2>办理单位</h2>
<div class="add-negation-container"> <div class="add-negation-container">
<el-form-item <el-form-item
label="审批流程" label="主办层级"
prop="approvalFlow" prop="hostLevel"
:rules="{ :rules="{
required: true, required: true,
message: '请选择审批流程', message: '请选择主办层级',
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-radio-group v-model="form.approvalFlow"> <el-select
<el-radio style="width: 280px"
v-for="item in dict.approvalFlow" v-model="form.hostLevel"
:key="item.dictCode" @change="handleChangeHostLevel"
>
<el-option
v-for="item in dict.hostLevel"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue" :value="item.dictValue"
>{{ item.dictLabel />
}}{{ </el-select>
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
<div class="tips mt-10"> <div class="tips mt-10">
<p> <p>
三级审核 在问题提交办结时需经过所队>二级机构>市局三级审核通过后方可办结 如主办层级 市局主办
则由督察支队办理
</p> </p>
<p> <p>
二级审核 在问题提交办结时仅需经过所队>二级机构两级审核通过后即可办结 如主办层级为 二级机构主办则由督察部门办理可进一步下发
</p>
<p style="color: var(--danger-color)">
如主办层级为 三级机构主办则由所队办理
</p>
</div>
</el-form-item>
<el-form-item
label="指定办理单位"
prop="departId"
:rules="{
required: true,
message: '请选择办理单位',
trigger: ['blur'],
}"
>
<div class="flex gap">
<div style="width: 280px">
<template
v-if="
form.hostLevel === HostLevel.THREE
"
>
<depart-tree-select
v-model="form.departId"
v-loading="departLoading"
/>
</template>
<el-tree-select
v-else
:data="departs"
:props="{
label: 'shortName',
value: 'id',
}"
node-key="id"
clearable
filterable
v-model="form.departId"
@node-click="handleSelectDepart"
check-strictly
style="width: 280px"
v-loading="departLoading"
/>
</div>
<el-button
type="primary"
@click="handleLinkDepart"
text
v-if="form.hostLevel !== HostLevel.FIRST"
>关联问题涉及单位</el-button
>
</div>
<div class="tips mt-10">
<p>问题涉及单位 指与该问题相关的单位</p>
<p>
指定具体办理单位
指将问题分派给哪个单位办理
</p> </p>
</div> </div>
</el-form-item> </el-form-item>
</div> </div>
</div> <h2>办理时限</h2>
<div class="add-negation-container">
<el-form-item
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
trigger: ['blur'],
}"
>
<time-limit-select
v-model="form.timeLimit"
v-model:maxSignDuration="form.maxSignDuration"
v-model:maxHandleDuration="
form.maxHandleDuration
"
v-model:maxExtensionDuration="
form.maxExtensionDuration
"
/>
</el-form-item>
</div>
<div>
<h2>审批流程</h2>
<div class="add-negation-container">
<el-form-item
label="审批流程"
prop="approvalFlow"
:rules="{
required: true,
message: '请选择审批流程',
trigger: ['blur'],
}"
>
<el-radio-group v-model="form.approvalFlow">
<el-radio
v-for="item in dict.approvalFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark
? `(${item.remark})`
: ""
}}</el-radio
>
</el-radio-group>
<div class="tips mt-10">
<p>
三级审核 在问题提交办结时需经过所队>二级机构>市局三级审核通过后方可办结
</p>
<p>
二级审核 在问题提交办结时仅需经过所队>二级机构两级审核通过后即可办结
</p>
</div>
</el-form-item>
</div>
</div>
</template>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
<footer class="flex end"> <footer class="flex end">
@ -449,7 +472,7 @@
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import moment from 'moment' import moment from "moment";
import { import {
HostLevel, HostLevel,
TimeLimit, TimeLimit,
@ -487,6 +510,7 @@ const form = ref({
hostLevel: HostLevel.THREE, hostLevel: HostLevel.THREE,
timeLimit: TimeLimit.WORK_137, timeLimit: TimeLimit.WORK_137,
approvalFlow: ApprovalFlow.SECOND, approvalFlow: ApprovalFlow.SECOND,
flowFlag: true
}); });
watch( watch(
@ -546,6 +570,10 @@ function handleSelectDepart(row, node) {
} }
function handleLinkDepart() { function handleLinkDepart() {
if (form.value.hostLevel === HostLevel.SECOND) {
feedback.msgWarning('当前选择二级机构主办,指定办理单位请选择二级机构!')
return
}
form.value.departId = form.value.involveDepartId; form.value.departId = form.value.involveDepartId;
form.value.departName = form.value.involveDepartName; form.value.departName = form.value.involveDepartName;
} }
@ -560,7 +588,7 @@ function handleChangeHostLevel(val) {
} }
function disabledDate(time) { function disabledDate(time) {
return time.getTime() < moment('1949-10-01', 'YYYY-MM-DD').valueOf() return time.getTime() < moment("1949-10-01", "YYYY-MM-DD").valueOf();
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

8
src/components/negative/apply-countersign.vue

@ -65,6 +65,14 @@ const formData = ref({
}) })
const formRef = ref() const formRef = ref()
const negative = inject('negative')
watch(() => negative.value.id, () => {
formData.value = {
countersignDeparts: [{}]
}
})
function handleAddDepart() { function handleAddDepart() {
formData.value.countersignDeparts.push({}) formData.value.countersignDeparts.push({})
} }

6
src/components/negative/countersign.vue

@ -20,6 +20,12 @@
const formData = ref({}); const formData = ref({});
const formRef = ref(); const formRef = ref();
const negative = inject('negative')
watch(() => negative.value.id, () => {
formData.value = {}
})
async function validate() { async function validate() {
await formRef.value.validate(); await formRef.value.validate();
return formData.value; return formData.value;

4
src/views/sensitivePerception/Model.vue

@ -12,7 +12,8 @@
@click="handleChangeClass(item.id)" @click="handleChangeClass(item.id)"
:active="query.classId === item.id" :active="query.classId === item.id"
> >
{{ item.name }} <span :title="item.name">{{ item.name }}</span>
<span class="ml-8 text-primary text-bold">{{ item.size }}</span>
</div> </div>
</div> </div>
</el-col> </el-col>
@ -980,6 +981,7 @@ function goClue() {
line-height: 47px; line-height: 47px;
padding-left: 36px; padding-left: 36px;
white-space: nowrap; white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
&:hover, &:hover,
&[active="true"] { &[active="true"] {

2
src/views/sensitivePerception/RiskPersonnel.vue

@ -66,7 +66,7 @@
</header> </header>
<div class="table-container"> <div class="table-container">
<el-table :data="list"> <el-table :data="list">
<el-table-column label="姓名" prop="name" width="100" /> <el-table-column label="姓名" prop="name" width="80" />
<el-table-column <el-table-column
label="性别" label="性别"
prop="gender" prop="gender"

15
src/views/system/Police.vue

@ -475,6 +475,19 @@
<el-button type="primary" @click="submit">确定</el-button> <el-button type="primary" @click="submit">确定</el-button>
</footer> </footer>
</el-dialog> </el-dialog>
<el-dialog title="删除" v-model="delDialog">
<el-form>
<el-form-item title="删除原因">
<el-select>
<el-option></el-option>
</el-select>
</el-form-item>
<el-form-item title="其他原因">
<el-input />
</el-form-item>
</el-form>
</el-dialog>
</template> </template>
<script setup> <script setup>
import { BASE_PATH } from "@/api/request"; import { BASE_PATH } from "@/api/request";
@ -651,6 +664,8 @@ function handleError(result) {
importLoading.close(); importLoading.close();
feedback.msgError(result.message || "上传失败!"); feedback.msgError(result.message || "上传失败!");
} }
const delDialog = ref(false)
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>
Loading…
Cancel
Save