Browse Source

fix: 修复核查办理添加涉及人员

fix: 完善申请延期详情界面
fit: 待办新增核查情况、处置结果查询条件
fit: 综合查询新增专项督察、通报期数查询条件
main
wxc 1 year ago
parent
commit
6749ac0ea9
  1. 3
      .gitignore
  2. 44
      src/components/negative/add.vue
  3. 113
      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. 92
      src/views/work/Todo.vue

3
.gitignore vendored

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

44
src/components/negative/add.vue

@ -187,7 +187,27 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </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-col :span="12">
<el-form-item-ext <el-form-item-ext
label="涉及警种" label="涉及警种"
@ -215,28 +235,6 @@
</el-select> </el-select>
</el-form-item-ext> </el-form-item-ext>
</el-col> </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>
<el-row <el-row
v-if=" v-if="

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

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

4
src/components/negative/countdown.vue

@ -28,7 +28,7 @@
</template> </template>
</div> </div>
<div class="tips">剩余处理时间</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> </div>
</el-progress> </el-progress>
<div v-else class="countdown-container_danger flex center v-center column"> <div v-else class="countdown-container_danger flex center v-center column">
@ -51,7 +51,7 @@
</template> </template>
</div> </div>
<div>已超时</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> </div>
</template> </template>
<script setup> <script setup>

2
src/components/negative/description.vue

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

4
src/components/negative/dialog.vue

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

4
src/components/negative/return.vue

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

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

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

25
src/components/negative/verify.vue

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

14
src/components/police-select.vue

@ -45,6 +45,10 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
disabldKeys: {
type: Array,
default: [],
},
}); });
const emit = defineEmits("update:modelValue", "change"); 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) { function onChange(val) {
console.log("onChange", val);
emit("change", polices.value.filter((item) => item.empNo === val)[0]); emit("change", polices.value.filter((item) => item.empNo === val)[0]);
} }
</script> </script>

23
src/style/public.scss

@ -485,3 +485,26 @@ svg + span {
transform: translateY(-50%); 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" :value="item.dictValue"
/> />
</el-select> </el-select>
<el-select <el-select
size="small" size="small"
style="width: 120px" style="width: 120px"
@ -205,8 +206,22 @@
<el-option label="已申请" :value="true" /> <el-option label="已申请" :value="true" />
<el-option label="未申请" :value="false" /> <el-option label="未申请" :value="false" />
</el-select> </el-select>
<el-select
<el-input placeholder="任务ID" size="small" style="width: 146px" clearable /> 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>
</div> </div>
</el-form> </el-form>
@ -575,7 +590,27 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </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-col :span="12">
<el-form-item-ext <el-form-item-ext
label="涉及警种" label="涉及警种"
@ -602,28 +637,6 @@
</el-select> </el-select>
</el-form-item-ext> </el-form-item-ext>
</el-col> </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>
<el-row <el-row
v-if=" v-if="
@ -886,27 +899,6 @@ function handleSelectInvolveProblem(vals) {
} }
</script> </script>
<style lang="scss" scoped> <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> </style>

92
src/views/work/Todo.vue

@ -5,12 +5,21 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题发生时间"> <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-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="问题来源"> <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-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -67,10 +76,48 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理状态"> <el-form-item label="办理状态">
<dict-select name="processingStatus" v-model="query.processingStatus" /> <dict-select
name="processingStatus"
v-model="query.processingStatus"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> </el-col>
</el-row> </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> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
<div> <div>
@ -133,7 +180,9 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>涉嫌问题</label> <label>涉嫌问题</label>
<span>{{ getInvolveProblem(row.involveProblem) }}</span> <span>{{
getInvolveProblem(row.involveProblem)
}}</span>
</div> </div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
@ -148,7 +197,7 @@
</div> </div>
</template> </template>
</el-table-column> </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="problemSources" />
<el-table-column label="业务类别" prop="businessTypeName" /> <el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题"> <el-table-column label="涉嫌问题">
@ -162,15 +211,19 @@
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="涉及单位" show-overflow-tooltip> <el-table-column label="涉及单位" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span>{{row.involveDepartName}}</span> <span>{{ row.involveDepartName }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理单位" show-overflow-tooltip> <el-table-column label="办理单位" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span>{{row.handleSecondDepartName}}{{row.handleThreeDepartName}}</span> <span
</template> >{{ row.handleSecondDepartName
</el-table-column> }}{{ row.handleThreeDepartName }}</span
>
</template>
</el-table-column>
<el-table-column label="核查情况" prop="checkStatusName" width="100" align="center" />
<el-table-column label="办理状态"> <el-table-column label="办理状态">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag>{{
@ -225,11 +278,7 @@
:disabled="false" :disabled="false"
/> />
<negative-add <negative-add v-model="addShow" @close="addShow = false" />
v-model="addShow"
@close="addShow = false"
/>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { listTodos } from "@/api/work"; import { listTodos } from "@/api/work";
@ -241,7 +290,9 @@ import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts([ const dict = catchStore.getDicts([
"suspectProblem", "suspectProblem",
"processingStatus" "processingStatus",
"inspectCase",
"handleResult",
]); ]);
const flowNodes = catchStore.getFlowNodes(); const flowNodes = catchStore.getFlowNodes();
const dictProblemSources = catchStore.getDictProblemSources(); const dictProblemSources = catchStore.getDictProblemSources();
@ -287,9 +338,6 @@ function handleAction(row) {
} }
const addShow = ref(false); const addShow = ref(false);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>
Loading…
Cancel
Save