Browse Source

Merge remote-tracking branch 'origin/master'

main
parent
commit
5e44092b1d
  1. 1
      .gitignore
  2. 44
      src/components/negative/add.vue
  3. 111
      src/components/negative/apply-extension-description.vue
  4. 4
      src/components/negative/countdown.vue
  5. 2
      src/components/negative/description.vue
  6. 4
      src/components/negative/dialog.vue
  7. 4
      src/components/negative/return.vue
  8. 20
      src/components/negative/verify-description.vue
  9. 25
      src/components/negative/verify.vue
  10. 14
      src/components/police-select.vue
  11. 23
      src/style/public.scss
  12. 88
      src/views/work/Query.vue
  13. 80
      src/views/work/Todo.vue

1
.gitignore vendored

@ -8,3 +8,4 @@ package-lock.json
pnpm-lock.yaml
auto-imports.d.ts
components.d.ts
vite.config.ts.timestamp-*

44
src/components/negative/add.vue

@ -187,7 +187,27 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="form.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(form.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item-ext
label="涉及警种"
@ -215,28 +235,6 @@
</el-select>
</el-form-item-ext>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="form.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(form.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
v-if="

111
src/components/negative/apply-extension-description.vue

@ -1,65 +1,88 @@
<template>
<div
class="card-info mb-10"
v-if="extensionApply.id"
>
<div class="card-info mb-10" v-if="extensionApply.approveSteps">
<header class="flex">
<span class="primary">延期申请中</span>
<div class="step-item flex v-center">
<div class="number" :active="true">1</div>
<span>延期申请</span>
</div>
<div class="step-item flex v-center">
<el-tooltip
effect="dark"
:content="extensionApply.approves[extensionApply.approves.length - 1].comments"
raw-content
placement="top"
v-if="extensionApply.approves.length > 0"
<div
class="step-item flex v-center"
v-for="(item, index) in extensionApply.approveSteps"
:key="index"
>
<div class="number" :active="extensionApply.approves.length > 0">2</div>
</el-tooltip>
<div class="number" :active="extensionApply.approves.length > 0" v-else>2</div>
<span>二级机构专班审批</span>
</div>
<div class="step-item flex v-center">
<el-tooltip
effect="dark"
:content="extensionApply.approves[extensionApply.approves.length - 2].comments"
:content="item.comments"
raw-content
placement="top"
v-if="extensionApply.approves.length > 1"
v-if="item.comments"
>
<div class="number" :active="extensionApply.approves.length === 2">3</div>
<div
class="number"
:active="item.state === ApproveState.APPROVED"
:danger="item.state === ApproveState.REJECTED"
>
{{ index + 1 }}
</div>
</el-tooltip>
<div class="number" :active="extensionApply.approves.length === 2" v-else>3</div>
<span>市局专班审批</span>
<div
class="number"
:active="item.state === ApproveState.APPROVED"
:danger="item.state === ApproveState.REJECTED"
v-else
>
{{ index + 1 }}
</div>
<span>{{ item.title }}</span>
</div>
</header>
<div class="flex">
<div class="flex mb-10">
<div class="col col-6">
<label>延期时长</label>
<span>{{ extensionApply.extensionDays }}</span>
<span class="text-primary text-bold">{{ extensionApply.extensionDays }}</span>
</div>
<div class="col col-6">
<label>申请时间</label>
<span>{{ extensionApply.createTime }}</span>
</div>
<div class="col col-18">
</div>
<div class="col col-24">
<label>延期理由</label>
<span class="content" style="padding: 0">{{ extensionApply.comments }}</span>
<span class="content" style="padding: 0">{{
extensionApply.comments
}}</span>
</div>
<div
class="mt-10 rejected-box"
v-if="
extensionApply.approveSteps?.filter(
(item) => item.state === ApproveState.REJECTED
).length
"
>
<div class="mb-4">申请延期驳回</div>
<div class="rejected-body text-wrap">
{{
extensionApply.approveSteps.filter(
(item) => item.state === ApproveState.REJECTED
)[0].comments
}}
</div>
<!-- <div class="flex mt-20">
<div class="col" style="width: 100%">
<label>驳回理由</label>
<span style="width: calc(100% - 74px)">{{ }}</span>
<div class="text-right rejected-footer">{{
extensionApply.approveSteps.filter(
(item) => item.state === ApproveState.REJECTED
)[0].createTime
}}</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { ApproveState } from "@/enums/flowEnums";
const extensionApply = inject('extensionApply')
console.log('extensionApply', extensionApply)
const extensionApply = inject("extensionApply");
console.log("extensionApply", extensionApply);
</script>
<style lang="scss" scoped>
.col {
--label-width: 60px;
}
.card-info {
background: #f4f5ff;
border: 1px solid rgba(195, 202, 245, 1);
@ -102,12 +125,22 @@ console.log('extensionApply', extensionApply)
background: var(--primary-color);
color: #fff;
}
&[return="true"] {
&[danger="true"] {
background: var(--danger-color);
color: #fff;
}
}
}
}
}
.rejected-box {
background-color: #FEEDED;
padding: 8px;
.rejected-body {
color: #333;
}
.rejected-footer {
font-size: 12px;
}
}
</style>

4
src/components/negative/countdown.vue

@ -28,7 +28,7 @@
</template>
</div>
<div class="tips">剩余处理时间</div>
<div class="tips mt-8" style="font-size: 12px" v-if="extensionDays > 0">延期{{ extensionDays }}</div>
<div class="tips mt-8" style="font-size: 12px" v-if="extensionDays > 0">已延期 <span class="text-primary text-bold">{{ extensionDays }}</span></div>
</div>
</el-progress>
<div v-else class="countdown-container_danger flex center v-center column">
@ -51,7 +51,7 @@
</template>
</div>
<div>已超时</div>
<div class="mt-8 text-small" v-if="extensionDays > 0">延期{{ extensionDays }}</div>
<div class="mt-8 text-small" v-if="extensionDays > 0">延期{{ extensionDays }}</div>
</div>
</template>
<script setup>

2
src/components/negative/description.vue

@ -85,7 +85,7 @@ const dict = catchSotre.getDicts([
background: #F9FAFF;
box-shadow: 0px 2px 4px 0px rgba(133,150,248,0.47);
padding: 20px;
margin: 0px 2px 4px 2px;
margin: 0 2px 4px 2px;
h3 {
margin-top: 0;
}

4
src/components/negative/dialog.vue

@ -262,7 +262,7 @@ watch(
const confirmationCompletionFlag = ref(false);
function getDetails() {
loading.value = true;
getNegativeDetails(props.id, work?.value.id).then((data) => {
getNegativeDetails(props.id, work?.value.workId).then((data) => {
negative.value = data.negative;
flowActions.value = data.flowActions;
actionHistory.value = data.actionHistory;
@ -322,7 +322,7 @@ async function handleExecute(action, data) {
}
loading.value = true;
await negativeExecute(props.id, {
workId: work?.value.id,
workId: work?.value.workId,
actionKey: action.actionKey,
nextFlowKey: action.nextFlowKey,
actionName: action.actionName,

4
src/components/negative/return.vue

@ -1,5 +1,5 @@
<template>
<el-dialog title="问题退回" v-model="show">
<el-dialog :title="negative.extensionApplyFlag ? `问题退回`: `申请延期驳回`" v-model="show">
<el-form
label-position="top"
ref="formRef"
@ -41,6 +41,8 @@ const show = ref(false);
const form = ref({});
const formRef = ref(null);
const negative = inject("negative");
async function submit() {
await formRef.value.validate();
show.value = false;

20
src/components/negative/verify-description.vue

@ -170,14 +170,18 @@
}}</span>
</div>
</div>
<div class="row" v-for="problem in blame.problems" :key="problem">
<div class="col col-6">
<label>问题类型</label>
<span>{{ problem.oneLevelContent }}</span>
</div>
<div class="col col-6">
<label>问题类别</label>
<span>{{ problem.twoLevelContent }}</span>
<div
class="row"
v-for="(problem, index) in blame.problems"
:key="index"
>
<div class="col col-24">
<label>问题类型{{ index + 1 }}</label>
<span
>{{ problem.oneLevelContent }} /
{{ problem.twoLevelContent }} /
{{ problem.threeLevelContent }}</span
>
</div>
</div>
<div class="row">

25
src/components/negative/verify.vue

@ -99,7 +99,6 @@
>
<el-radio-group
v-model="form.accountabilityTarget"
@change="handleAccountabilityTargetChange"
>
<el-radio
v-for="item in dict.accountabilityTarget"
@ -150,7 +149,7 @@
<el-form-item
label="问题整改情况"
prop="rectifyDesc"
v-if="form.checkStatus === InspectCase.TRUE"
v-if="form.checkStatus !== InspectCase.FALSE && form.isRectifyCode === InspectCase.TRUE"
:rules="{
required: true,
message: '请输入问题整改情况',
@ -217,16 +216,13 @@
>
<police-select
:host-level="negative.hostLevel"
:depart-id="
negative.hostLevel === HostLevel.SECOND
:depart-id="negative.hostLevel === HostLevel.SECOND
? negative.handleSecondDepartId
: negative.handleThreeDepartId
"
v-model="item.blameEmpNo"
@change="
(police) =>
handleChangePolice(police, item)
"
:disabldKeys="form.blames.filter(obj => obj.blameEmpNo).map(obj => obj.blameEmpNo)"
@change="(police) => handleChangePolice(police, item)"
/>
</el-form-item>
</el-col>
@ -1169,13 +1165,12 @@
>
</p>
<p>
如申请容错免责请提供警务评议容错免责申请表
如申请容错免责请提供容错免责申请表
<a
class="link"
:href="`${BASE_PATH}/templates/《警务评议容错免责申请表》.docx`"
target="__blank"
>下载链接</a
>
>下载链接</a>
</p>
<p>
针对群众不满意的原因请提交无过错的音视频微信或短信截图等证明材料
@ -1213,7 +1208,6 @@ import {
SubjectiveAspect,
} from "@/enums/dictEnums";
import useCatchStore from "@/stores/modules/catch";
import {computed} from "vue";
const catchSotre = useCatchStore();
const dict = catchSotre.getDicts([
@ -1302,7 +1296,7 @@ function handleChangeLead(val, blame) {
}
//
function handleAccountabilityTargetChange(val) {
watch(() => form.value.accountabilityTarget, (val) => {
if (
val === AccountabilityTarget.PERSONAL &&
!form.value.blames.filter((item) => item.type === BlameType.PERSONAL)
@ -1314,6 +1308,7 @@ function handleAccountabilityTargetChange(val) {
handleRemovePersonal(item);
}
});
}
if (val === AccountabilityTarget.DEPARTMENT) {
form.value.blames.forEach((item) => {
@ -1331,6 +1326,7 @@ function handleAccountabilityTargetChange(val) {
problems: [{}],
});
}
form.value.blameLeaders = []
}
if (val === AccountabilityTarget.PERSONAL_AND_DEPARTMENT) {
if (
@ -1351,7 +1347,7 @@ function handleAccountabilityTargetChange(val) {
});
}
}
}
})
function handleChangeCheckStatus(val, item) {
form.value.checkStatusName = dict.inspectCase.filter(
@ -1424,7 +1420,6 @@ async function validate() {
);
}
}
return form.value;
}
}

14
src/components/police-select.vue

@ -45,6 +45,10 @@ const props = defineProps({
type: Boolean,
default: false,
},
disabldKeys: {
type: Array,
default: [],
},
});
const emit = defineEmits("update:modelValue", "change");
@ -72,8 +76,16 @@ async function getPolices() {
}
}
watch(
() => props.disabldKeys,
() => {
polices.value.forEach((item) => {
item.disabled = props.disabldKeys.includes(item.empNo);
});
}
);
function onChange(val) {
console.log("onChange", val);
emit("change", polices.value.filter((item) => item.empNo === val)[0]);
}
</script>

23
src/style/public.scss

@ -485,3 +485,26 @@ svg + span {
transform: translateY(-50%);
}
}
.form-row {
margin-bottom: 18px;
label {
width: 120px;
line-height: 24px;
padding-right: 12px;
box-sizing: border-box;
text-align: right;
& + * {
width: calc(100% - 126px);
}
}
.btn-box {
width: 70px;
}
.el-form-item {
margin-bottom: 0;
}
}
.query-box {
gap: 10px 20px;
}

88
src/views/work/Query.vue

@ -128,6 +128,7 @@
:value="item.dictValue"
/>
</el-select>
<el-select
size="small"
style="width: 120px"
@ -205,8 +206,22 @@
<el-option label="已申请" :value="true" />
<el-option label="未申请" :value="false" />
</el-select>
<el-input placeholder="任务ID" size="small" style="width: 146px" clearable />
<el-select
size="small"
style="width: 146px"
placeholder="专项督察"
clearable
v-model="query.specialSupervision"
>
<el-option
v-for="item in dict.specialSupervision"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
<el-input placeholder="通报期数" size="small" style="width: 146px" v-model="query.reportNumber" clearable />
<!-- <el-input placeholder="任务ID" size="small" style="width: 146px" clearable /> -->
</div>
</div>
</el-form>
@ -575,7 +590,27 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="formData.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(formData.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item-ext
label="涉及警种"
@ -602,28 +637,6 @@
</el-select>
</el-form-item-ext>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="formData.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(formData.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
v-if="
@ -886,27 +899,6 @@ function handleSelectInvolveProblem(vals) {
}
</script>
<style lang="scss" scoped>
.form-row {
padding: 8px 0;
box-shadow: inset 0px -1px 0px 0px #ebebeb;
label {
width: 120px;
line-height: 24px;
padding-right: 12px;
box-sizing: border-box;
text-align: right;
& + * {
width: calc(100% - 126px);
}
}
.btn-box {
width: 70px;
}
.el-form-item {
margin-bottom: 0;
}
}
.query-box {
gap: 10px 20px;
}
</style>

80
src/views/work/Todo.vue

@ -5,12 +5,21 @@
<el-row>
<el-col :span="6">
<el-form-item label="问题发生时间">
<date-time-range-picker-ext v-model="query.happenTime"/>
<date-time-range-picker-ext
v-model="query.happenTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="问题来源">
<el-tree-select :data="dictProblemSources" :props="{value: 'id'}" node-key="id" v-model="query.problemSourcesCode" clearable filterable />
<el-tree-select
:data="dictProblemSources"
:props="{ value: 'id' }"
node-key="id"
v-model="query.problemSourcesCode"
clearable
filterable
/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -67,10 +76,48 @@
</el-col>
<el-col :span="6">
<el-form-item label="办理状态">
<dict-select name="processingStatus" v-model="query.processingStatus" />
<dict-select
name="processingStatus"
v-model="query.processingStatus"
/>
</el-form-item>
</el-col>
<el-col :span="6"> </el-col>
</el-row>
<div class="form-row flex">
<label class="text-center">其他选项</label>
<div class="flex wrap query-box">
<el-select
size="small"
style="width: 120px"
placeholder="核查情况"
clearable
v-model="query.checkStatus"
>
<el-option
v-for="item in dict.inspectCase"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
<el-select
placeholder="处置结果"
size="small"
style="width: 180px"
v-model="query.handleResultCode"
clearable
multiple
>
<el-option
v-for="item in dict.handleResult"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</div>
</div>
</el-form>
<div class="mb-25 flex between">
<div>
@ -133,7 +180,9 @@
</div>
<div class="col col-6">
<label>涉嫌问题</label>
<span>{{ getInvolveProblem(row.involveProblem) }}</span>
<span>{{
getInvolveProblem(row.involveProblem)
}}</span>
</div>
</div>
<div class="row mt-10">
@ -148,7 +197,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="问题发现时间" prop="discoveryTime" />
<el-table-column label="问题发现时间" prop="discoveryTime" width="160" />
<el-table-column label="问题来源" prop="problemSources" />
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题">
@ -163,14 +212,18 @@
/>
<el-table-column label="涉及单位" show-overflow-tooltip>
<template #default="{ row }">
<span>{{row.involveDepartName}}</span>
<span>{{ row.involveDepartName }}</span>
</template>
</el-table-column>
<el-table-column label="办理单位" show-overflow-tooltip>
<template #default="{ row }">
<span>{{row.handleSecondDepartName}}{{row.handleThreeDepartName}}</span>
<span
>{{ row.handleSecondDepartName
}}{{ row.handleThreeDepartName }}</span
>
</template>
</el-table-column>
<el-table-column label="核查情况" prop="checkStatusName" width="100" align="center" />
<el-table-column label="办理状态">
<template #default="{ row }">
<el-tag>{{
@ -225,11 +278,7 @@
:disabled="false"
/>
<negative-add
v-model="addShow"
@close="addShow = false"
/>
<negative-add v-model="addShow" @close="addShow = false" />
</template>
<script lang="ts" setup>
import { listTodos } from "@/api/work";
@ -241,7 +290,9 @@ import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"suspectProblem",
"processingStatus"
"processingStatus",
"inspectCase",
"handleResult",
]);
const flowNodes = catchStore.getFlowNodes();
const dictProblemSources = catchStore.getDictProblemSources();
@ -287,9 +338,6 @@ function handleAction(row) {
}
const addShow = ref(false);
</script>
<style lang="scss" scoped>
</style>
Loading…
Cancel
Save