Browse Source

fit: 认定办结问题打分

main
wxc 1 year ago
parent
commit
f9a1c057e7
  1. 6
      src/api/system/depart.ts
  2. 6
      src/api/work/negative.ts
  3. 10
      src/components/depart-tree-select.vue
  4. 3
      src/components/file/list.vue
  5. 1
      src/components/file/upload-group.vue
  6. 6
      src/components/home/work/my-todo.vue
  7. 9
      src/components/negative/add.vue
  8. 2
      src/components/negative/approve.vue
  9. 212
      src/components/negative/confirmation-completion.vue
  10. 1
      src/components/negative/countdown.vue
  11. 12
      src/components/negative/description.vue
  12. 48
      src/components/negative/dialog.vue
  13. 60
      src/components/negative/verify-description.vue
  14. 377
      src/components/negative/verify.vue
  15. 21
      src/components/police-select.vue
  16. 53
      src/components/problem-type-select.vue
  17. 24
      src/stores/modules/catch.ts
  18. 2
      src/utils/util.ts
  19. 5
      src/views/sensitivePerception/DictContent.vue
  20. 45
      src/views/work/Query.vue

6
src/api/system/depart.ts

@ -20,6 +20,12 @@ export function departTree() {
}); });
} }
export function departTreeAll() {
return request.get({
url: '/depart/treeAll'
});
}
export function secondList() { export function secondList() {
return request.get({ return request.get({
url: '/depart/second' url: '/depart/second'

6
src/api/work/negative.ts

@ -55,3 +55,9 @@ export function delNegative(id) {
url: `/negative/${id}` url: `/negative/${id}`
}); });
} }
export function getCompletionInfo(id) {
return request.get({
url: `/negative/completion/${id}`
});
}

10
src/components/depart-tree-select.vue

@ -6,13 +6,21 @@ import useCatchStore from '@/stores/modules/catch'
import { ROOT_DEPART_ID } from '@/enums/appEnums'; import { ROOT_DEPART_ID } from '@/enums/appEnums';
const data = ref([]) const data = ref([])
const departs = useCatchStore().getDeparts();
const props = defineProps({ const props = defineProps({
showRoot: { showRoot: {
type: Boolean, type: Boolean,
default: false default: false
},
auth: {
type: Boolean,
default: true
} }
}) })
const catchSotre = useCatchStore();
const departs = props.auth ? catchSotre.getDeparts() : catchSotre.getDepartsAll();
onMounted(() => { onMounted(() => {
getData() getData()
}) })

3
src/components/file/list.vue

@ -250,6 +250,8 @@ const scale = ref(0);
const translateX = ref(0); const translateX = ref(0);
const translateY = ref(0); const translateY = ref(0);
let moveFlag = false; let moveFlag = false;
let initialX = 0;
let initialY = 0;
const fileRrror = ref(false); const fileRrror = ref(false);
function filePreview(file) { function filePreview(file) {
@ -299,7 +301,6 @@ function wheel(event) {
} }
} }
function mousedown() { function mousedown() {
moveFlag = true; moveFlag = true;
initialX = event.clientX; initialX = event.clientX;

1
src/components/file/upload-group.vue

@ -263,6 +263,7 @@ function uploadProgress(progressEvent, file) {
function handleSuccess(data, file) { function handleSuccess(data, file) {
if (data.code !== 200) { if (data.code !== 200) {
feedback.msgError("上传失败!");
return; return;
} }
const filterFiles = fileList.value.filter((item) => file.uid === item.uid); const filterFiles = fileList.value.filter((item) => file.uid === item.uid);

6
src/components/home/work/my-todo.vue

@ -107,6 +107,12 @@
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column
label="是否属实"
prop="checkStatusName"
width="100"
align="center"
/>
<el-table-column label="办理状态" width="140" align="center"> <el-table-column label="办理状态" width="140" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-tag <el-tag

9
src/components/negative/add.vue

@ -339,6 +339,7 @@
<el-select <el-select
style="width: 280px" style="width: 280px"
v-model="form.hostLevel" v-model="form.hostLevel"
@change="handleChangeHostLevel"
> >
<el-option <el-option
v-for="item in dict.hostLevel" v-for="item in dict.hostLevel"
@ -398,6 +399,7 @@
type="primary" type="primary"
@click="handleLinkDepart" @click="handleLinkDepart"
text text
v-if="form.hostLevel !== HostLevel.FIRST"
>关联问题涉及单位</el-button >关联问题涉及单位</el-button
> >
</div> </div>
@ -588,6 +590,13 @@ function handleLinkDepart() {
form.value.departId = form.value.involveDepartId; form.value.departId = form.value.involveDepartId;
form.value.departName = form.value.involveDepartName; form.value.departName = form.value.involveDepartName;
} }
function handleChangeHostLevel(val) {
if (val === HostLevel.FIRST) {
form.value.departId = ''
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.add-negation-container { .add-negation-container {

2
src/components/negative/approve.vue

@ -49,7 +49,7 @@ async function submit() {
emit("submit", form.value); emit("submit", form.value);
} }
async function open() { function open() {
show.value = true; show.value = true;
} }

212
src/components/negative/confirmation-completion.vue

@ -1,41 +1,102 @@
<template> <template>
<el-dialog title="认定办结" v-model="show" top="5vh" width="900px"> <el-dialog title="认定办结" top="5vh" width="900px" v-model="show">
<h3>问题赋分情况</h3> <h3>问题赋分情况</h3>
<p> <p>
赋分公式基础分值*1+问题严重等级系数*1+ 基础风险值 + (基础风险值 * 问题严重等级系数 ) + (基础风险值 * 问题发生频次系数)
问题出现频次系数*1+问题发生率系数 <a
class="link"
:href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`"
target="__blank"
>
<span>查看文档</span>
</a>
</p> </p>
<el-form :label-width="120"> <el-form :label-width="120" ref="formRef" :model="formData">
<div v-for="(item, index) in negative.blames"> <div v-for="(item, index) in blames" :key="index">
<h5>涉及人员</h5> <h5>涉及人员{{ index + 1 }}</h5>
<div class="row"> <div class="row">
<div class="col col-6"> <div class="col col-6">
<label>姓名</label> <label>姓名</label>
<span>{{}}</span> <span>{{ item.blameName }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>警号</label> <label>警号</label>
<span>{{}}</span> <span>{{ item.blameEmpNo }}</span>
</div>
</div> </div>
<div class="col col-12"> <div class="row">
<div
class="col col-24"
v-for="problem in item.problems"
:key="problem"
>
<label>问题类型</label> <label>问题类型</label>
<span>{{}}</span> <span>
<span>{{ problem.oneLevelContent }}</span>
<span>{{
problem.twoLevelContent
? " / " + problem.twoLevelContent
: ""
}}</span>
<span>{{
problem.threeLevelContent
? " / " + problem.threeLevelContent
: ""
}}</span>
</span>
</div> </div>
</div> </div>
<el-form-item label="严重等级"> </el-form-item> <el-form-item
<h5>问题赋分</h5> label="严重等级"
:rules="{
required: true,
message: '请选择严重等级',
trigger: ['blur'],
}"
:prop="`blames.${index}.negativeLevel`"
>
<el-radio-group
v-model="formData.blames[index].negativeLevel"
>
<el-radio
v-for="item in dict.negativeLevel"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
<div class="mb-8" style="color: #333">问题赋分</div>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="12">
<div class="mb-4">问题严重等级</div> <div class="mb-4">问题严重等级系数</div>
<div>0.3严重影响 赋分增加 30%</div> <div>
</el-col> <span class="text-primary">{{
<el-col :span="8"> getNegativeLevelScore(
<div class="mb-4">问题严重等级</div> formData.blames[index].negativeLevel
<div>0.53 赋分增加 50%</div> )
}}</span>
<span class="ml-8">{{
formData.blames[index].negativeLevel
? "(" +
getDictLable(
dict.negativeLevel,
formData.blames[index].negativeLevel
) +
")"
: ""
}}</span>
</div>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="12">
<div class="mb-4">问题严重等级</div> <div class="mb-4">问题发生频次系数()</div>
<div>0.15问题发生率xxx xxx, 赋分增加 15%</div> <div>
<span class="text-primary">{{ item.frequencyScore }}</span>
<span class="ml-8">(总计{{ item.frequency }})</span>
</div>
</el-col> </el-col>
</el-row> </el-row>
<div class="row mt-8"> <div class="row mt-8">
@ -43,21 +104,32 @@
<label style="--label-width: 60px" <label style="--label-width: 60px"
><span>分值计算</span></label ><span>分值计算</span></label
> >
<span>3*1+0.3*1+0.5*1+0.15= 6.7275 </span> <span
>{{ item.baseScore }} + (1 *
{{
getNegativeLevelScore(
formData.blames[index].negativeLevel
)
}}) + (1 * {{ item.frequencyScore }}) =
<span class="text-danger">{{
getScore(item, index)
}}</span>
</span
>
</div> </div>
</div> </div>
</div> </div>
<div class="mt-20 mb-20"> <div class="mt-10 mb-20 text-small">
<p> <p>
一般影响当问题导致一般性投诉或轻微的内部管理问题时分值为基础分值 一般影响当问题导致一般性投诉或轻微的内部管理问题时分值为基础分值
</p> </p>
<p> <p>
严重影响当问题导致较大投诉或内部管理问题时分值将在基础分值的基础上增加 严重影响当问题导致较大投诉或内部管理问题时分值将在基础分值的基础上增加
30% 20%
</p> </p>
<p> <p>
重大影响当问题导致重大法律责任或产生严重负面社会影响时分值将在基础分值的基础上增加 重大影响当问题导致重大法律责任或产生严重负面社会影响时分值将在基础分值的基础上增加
80% 50%
</p> </p>
</div> </div>
<h3>认定办结情况</h3> <h3>认定办结情况</h3>
@ -122,26 +194,104 @@
type="textarea" type="textarea"
v-model="formData.completionComment" v-model="formData.completionComment"
placeholder="请输入" placeholder="请输入"
:autosize="{ minRows: 4 }"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
<footer class="flex end"> <footer class="flex end">
<el-button>取消</el-button> <el-button size="large">取消</el-button>
<el-button type="primary">认定办结</el-button> <el-button type="primary" size="large" @click="submit"
>认定办结</el-button
>
</footer> </footer>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { BASE_PATH } from "@/api/request";
import { getCompletionInfo } from "@/api/work/negative";
import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts(["verifySituation", "verifyFileSituation"]); const dict = catchStore.getDicts([
"verifySituation",
"verifyFileSituation",
"negativeLevel",
]);
const formData = ref({}); const formData = ref({
blames: [],
});
const formRef = ref(null); const formRef = ref(null);
const show = ref(true);
const negative = inject("negative"); const negative = inject("negative");
const loading = ref(false);
const blames = ref([]);
let negativeLevels = [];
watch(negative, () => {
init();
});
onMounted(() => {
init();
});
async function init() {
if (!negative.value.id) {
return;
}
loading.value = true;
formData.value = {
blames: [],
};
const data = await getCompletionInfo(negative.value.id);
formData.value.blames = data.blames.map((item) => {
return {
blameIdCode: item.blameIdCode,
baseScore: item.baseScore,
frequencyScore: item.frequencyScore,
incidenceRateScore: item.incidenceRateScore,
};
});
blames.value = data.blames;
blames.value = data.blames;
negativeLevels = data.negativeLevels;
loading.value = false;
}
function getNegativeLevelScore(val) {
const results = negativeLevels.filter((item) => item.value === val);
if (!results.length) {
return 0;
}
return results[0].score;
}
function getScore(item, index) {
return (
item.baseScore +
(1 *
getNegativeLevelScore(formData.value.blames[index].negativeLevel)) +
(1 * item.frequencyScore)
).toFixed(2);
}
const emit = defineEmits(["submit"]);
const show = ref(false);
async function submit() {
await formRef.value.validate();
show.value = false;
emit("submit", formData.value);
}
function open() {
show.value = true;
}
defineExpose({
open,
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
h3 { h3 {

1
src/components/negative/countdown.vue

@ -115,7 +115,6 @@ function updateState(val) {
let timer; let timer;
onMounted(() => { onMounted(() => {
console.log("onMounted");
updateState(props.time); updateState(props.time);
if (props.time < 3600 && props.time > -3600) { if (props.time < 3600 && props.time > -3600) {
clearInterval(timer); clearInterval(timer);

12
src/components/negative/description.vue

@ -12,7 +12,7 @@
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题发生时间</label> <label>问题发生时间</label>
<span>{{ negative.happenTime }}</span> <span>{{ negative.happenTime || '/' }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>问题来源</label> <label>问题来源</label>
@ -30,10 +30,6 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col col-6">
<label>业务类别</label>
<span>{{ negative.businessTypeName }}</span>
</div>
<div class="col col-6" v-if="negative.specialSupervision"> <div class="col col-6" v-if="negative.specialSupervision">
<label>专项督察</label> <label>专项督察</label>
<span>{{ getDictLable(dict.specialSupervision, negative.specialSupervision) }}</span> <span>{{ getDictLable(dict.specialSupervision, negative.specialSupervision) }}</span>
@ -42,9 +38,13 @@
<label>警情期数</label> <label>警情期数</label>
<span>{{ negative.reportNumber }}</span> <span>{{ negative.reportNumber }}</span>
</div> </div>
<div class="col col-6">
<label>业务类别</label>
<span>{{ negative.businessTypeName }}</span>
</div>
<div class="col col-6"> <div class="col col-6">
<label>涉及警种</label> <label>涉及警种</label>
<span>{{ negative.policeTypeName }}</span> <span>{{ negative.policeTypeName || '/' }}</span>
</div> </div>
<div class="col col-12"> <div class="col col-12">
<label>涉嫌问题</label> <label>涉嫌问题</label>

48
src/components/negative/dialog.vue

@ -84,6 +84,20 @@
:extensionDays="negative.extensionDays" :extensionDays="negative.extensionDays"
/> />
</template> </template>
<div class="row">
<div class="col col-24" style="--label-width: 60px">
<label>办理时限</label>
<span>{{ getDictLable(dict.timeLimit, negative.timeLimit) }}</span>
</div>
<div class="col col-24" style="--label-width: 60px">
<label>主办层级</label>
<span>{{ getDictLable(dict.hostLevel, negative.hostLevel) }}</span>
</div>
<div class="col col-24" style="--label-width: 60px">
<label>审批流程</label>
<span>{{ getDictLable(dict.approvalFlow, negative.approvalFlow) }}</span>
</div>
</div>
<negative-action-history /> <negative-action-history />
</div> </div>
</el-col> </el-col>
@ -180,11 +194,16 @@
/> />
</template> </template>
</template> </template>
<template v-if="confirmationCompletionFlag && flowActions.length">
<!-- <negative-confirmation-completion /> --> <negative-confirmation-completion
@submit="handleSubmitExecute"
ref="confirmationCompletionRef"
/>
</template>
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ApprovalFlow } from "@/enums/dictEnums";
import { import {
FlowActionEnum, FlowActionEnum,
FlowNodeEnum, FlowNodeEnum,
@ -194,9 +213,11 @@ import { getNegativeDetails, negativeExecute } from "@/api/work/negative";
import { addFav, delFav } from "@/api/work/fav"; import { addFav, delFav } from "@/api/work/fav";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import { getComponents } from "@/utils/flow"; import { getComponents } from "@/utils/flow";
import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const dict = useCatchStore().getDicts(["processingStatus"]); const dict = useCatchStore().getDicts(["processingStatus", "timeLimit", "approvalFlow", "hostLevel"]);
const props = defineProps({ const props = defineProps({
id: { id: {
@ -238,6 +259,7 @@ watch(
} }
); );
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.id).then((data) => {
@ -249,9 +271,10 @@ function getDetails() {
extensionApply.value = data.extensionApply || {}; extensionApply.value = data.extensionApply || {};
isFav.value = data.isFav; isFav.value = data.isFav;
remainingDuration.value = data.remainingDuration; remainingDuration.value = data.remainingDuration;
console.log(remainingDuration.value);
maxDuration.value = data.maxDuration; maxDuration.value = data.maxDuration;
components.value = getComponents(data.flowNode?.flowKey); components.value = getComponents(data.flowNode?.flowKey);
//
confirmationCompletionFlag.value = data.confirmationCompletionFlag;
loading.value = false; loading.value = false;
}); });
} }
@ -263,6 +286,9 @@ const setActionItemRef = (actionKey, el) => {
actionItemRefs.value[actionKey] = el; actionItemRefs.value[actionKey] = el;
} }
}; };
const confirmationCompletionRef = ref(null);
const activeAction = ref({}); const activeAction = ref({});
async function handleExecute(action, data) { async function handleExecute(action, data) {
if (action.validateForm) { if (action.validateForm) {
@ -270,7 +296,7 @@ async function handleExecute(action, data) {
try { try {
data = await componentRef.value.validate(); data = await componentRef.value.validate();
} catch (e) { } catch (e) {
feedback.msgWarning("请检查输入项"); feedback.msgWarning(e.message || "请检查输入项");
throw e; throw e;
} }
} else { } else {
@ -278,6 +304,18 @@ async function handleExecute(action, data) {
} }
} }
if (action.openDialog) { if (action.openDialog) {
if (
confirmationCompletionFlag.value &&
!action.actionKey.includes("_return")
) {
confirmationCompletionRef.value.open();
activeAction.value = {
actionName: "认定办结",
actionKey: "confirmationCompletion",
doClose: true
};
return;
}
actionItemRefs.value[action.actionKey].open(); actionItemRefs.value[action.actionKey].open();
activeAction.value = action; activeAction.value = action;
return; return;

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

@ -25,7 +25,7 @@
</div> </div>
<div class="row" v-if="negative.checkStatusDesc"> <div class="row" v-if="negative.checkStatusDesc">
<div class="col col-24"> <div class="col col-24">
<label>问题核查结果</label> <label>问题核查情况</label>
<span>{{ negative.checkStatusDesc }}</span> <span>{{ negative.checkStatusDesc }}</span>
</div> </div>
</div> </div>
@ -37,18 +37,13 @@
<span>{{ blame.blameName }} {{ blame.blameEmpNo }}</span> <span>{{ blame.blameName }} {{ blame.blameEmpNo }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>身份证号码</label> <label>身份证</label>
<span>{{ blame.blameIdCode }}</span> <span>{{ blame.blameIdCode }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>人员属性</label> <label>人员属性</label>
<span>{{ getDictLable(dict.personType, blame.ivPersonTypeCode) }}</span> <span>{{ getDictLable(dict.personType, blame.ivPersonTypeCode) }}</span>
</div> </div>
<div class="col col-6" v-if="blame.superviseMeasuresCode">
<label>督察措施</label>
<span>{{ blame.superviseMeasuresName }}</span>
</div>
</div> </div>
<div class="row" v-for="(problem, index) in blame.problems" :key="index"> <div class="row" v-for="(problem, index) in blame.problems" :key="index">
<div class="col col-24"> <div class="col col-24">
@ -57,32 +52,38 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col col-6" v-if="blame.subjectiveAspectCode">
<label>主观方面</label>
<span>{{ blame.subjectiveAspectName }}</span>
</div>
<div class="col col-6" v-if="blame.responsibilityTypeName"> <div class="col col-6" v-if="blame.responsibilityTypeName">
<label>责任类别</label> <label>责任类别</label>
<span>{{ blame.responsibilityTypeName }}</span> <span>{{ blame.responsibilityTypeName }}</span>
</div> </div>
<div class="col col-6" v-if="blame.subjectiveAspectCode">
<label>主观方面</label>
<span>{{ blame.subjectiveAspectName }}</span>
</div>
<div class="col col-6" v-if="blame.handleResultCode"> <div class="col col-6" v-if="blame.handleResultCode">
<label>处置结果</label> <label>处置结果</label>
<span>{{ blame.handleResultName }}</span> <span>{{ blame.handleResultName }}</span>
</div> </div>
<div class="col col-6" v-if="blame.superviseMeasuresCode">
<label>督察措施</label>
<span>{{ blame.superviseMeasuresName }}</span>
</div>
<div class="col col-6" v-if="blame.protectRightsName"> <div class="col col-6" v-if="blame.protectRightsName">
<label>维权容错</label> <label>维权容错</label>
<span>{{ blame.protectRightsName }}</span> <span>{{ blame.protectRightsName }}</span>
</div> </div>
</div> </div>
<div class="row" v-if="blame.assistCaseName"> <div class="row" v-for="item in negative.scorePolices.filter(item => blame.blameIdCode === item.idCode)" :key="item">
<div class="col col-6"> <div class="col col-6">
<label>帮扶对象</label> <label>问题风险指数</label>
<span>{{ blame.assistCaseName }}</span> <span style="color: var(--danger-color)" class="text-bold">{{ item.score }}</span>
</div> </div>
<div class="col col-18"> <div class="col col-6">
<label>帮扶起止时间</label> <label>公式</label>
<span>{{ blame.assistStartTime }}-{{ blame.assistEndTime }}</span> <span>{{ item.expression }}</span>
</div> </div>
</div> </div>
<div class="row" style="background: #f5f5f5"> <div class="row" style="background: #f5f5f5">
<div class="col col-6"> <div class="col col-6">
@ -90,7 +91,7 @@
<span>{{ blame.leadName }} {{ blame.leadEmpNo }}</span> <span>{{ blame.leadName }} {{ blame.leadEmpNo }}</span>
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label>身份证号码</label> <label>身份证</label>
<span>{{ blame.leadIdCode }}</span> <span>{{ blame.leadIdCode }}</span>
</div> </div>
@ -159,18 +160,37 @@
> >
<file-list :files="negative.files" /> <file-list :files="negative.files" />
</el-collapse-item> </el-collapse-item>
<el-collapse-item
title="认定办结"
name="completed"
v-if="negative.processingStatus === ProcessingStatus.COMPLETED"
>
<div class="row">
<div class="col col-6">
<label>核查办理情况</label>
<span>{{ getDictLable(dict.verifySituation, negative.verifySituation) }}</span>
</div>
<div class="col col-6">
<label>佐证材料情况</label>
<span>{{ getDictLable(dict.verifyFileSituation, negative.verifyFileSituation) }}</span>
</div>
</div>
</el-collapse-item>
</el-collapse> </el-collapse>
</template> </template>
<script setup> <script setup>
import { import {
BlameType BlameType
} from "@/enums/dictEnums"; } from "@/enums/dictEnums";
import {
ProcessingStatus
} from "@/enums/flowEnums";
import { getDictLable } from "@/utils/util"; import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const dict = useCatchStore().getDicts(["accountabilityTarget", "personType"]); const dict = useCatchStore().getDicts(["accountabilityTarget", "personType", "verifySituation", "verifyFileSituation",]);
const activeNames = ref(['verify', 'involved_department', 'completionAttachment']) const activeNames = ref(['verify', 'involved_department', 'completionAttachment', 'completed'])
const negative = inject('negative'); const negative = inject('negative');
for (let i = 0; i < negative.value.blames.filter(item => item.type === BlameType.PERSONAL).length; i++) { for (let i = 0; i < negative.value.blames.filter(item => item.type === BlameType.PERSONAL).length; i++) {

377
src/components/negative/verify.vue

@ -22,7 +22,10 @@
}" }"
> >
<div style="width: 280px"> <div style="width: 280px">
<depart-tree-select v-model="form.involveDepartId" /> <depart-tree-select
v-model="form.involveDepartId"
:auth="false"
/>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -141,6 +144,10 @@
v-model="form.checkStatusDesc" v-model="form.checkStatusDesc"
/> />
</el-form-item> </el-form-item>
<div
v-if="form.accountabilityTarget !== AccountabilityTarget.DEPARTMENT"
>
<el-form-item <el-form-item
label-position="top" label-position="top"
prop="blames" prop="blames"
@ -149,11 +156,14 @@
message: '请添加涉及人员', message: '请添加涉及人员',
trigger: ['change'], trigger: ['change'],
}" }"
v-if="form.checkStatus !== InspectCase.OTHER"
> >
<div v-for="(item, index) in form.blames" :key="index"> <div
<template v-if="item.type === BlameType.PERSONAL"> v-for="(item, index) in form.blames.filter(
<div class="flex between v-center"> (obj) => obj.type === BlameType.PERSONAL
)"
:key="index"
>
<div class="flex v-center">
<h5> <h5>
涉及人员{{ 涉及人员{{
form.blames form.blames
@ -169,7 +179,9 @@
plain plain
size="small" size="small"
@click="handleRemovePersonal(item)" @click="handleRemovePersonal(item)"
>删除人员</el-button text
class="ml-10"
>删除</el-button
> >
</div> </div>
<el-row> <el-row>
@ -192,7 +204,8 @@
" "
v-model="item.blameEmpNo" v-model="item.blameEmpNo"
@change=" @change="
(police) => handleChangePolice(police, item) (police) =>
handleChangePolice(police, item)
" "
/> />
</el-form-item> </el-form-item>
@ -271,8 +284,9 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
v-if="form.checkStatus !== InspectCase.FALSE" v-if="form.checkStatus !== InspectCase.FALSE"
style="margin-bottom: 0"
> >
<el-row style="width: 100%"> <el-row style="width: 98%">
<el-col <el-col
:span="24" :span="24"
v-for="(problem, j) in item.problems" v-for="(problem, j) in item.problems"
@ -287,68 +301,58 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-tree-select <div
class="flex between"
style="width: 90%"
>
<problem-type-select
v-model="problem.threeLevelCode" v-model="problem.threeLevelCode"
:data="dictContent" @change="
:props="{ (node) =>
label: 'name',
value: 'code',
}"
node-key="code"
clearable
filterable
accordion
style="width: 420px"
@current-change="
(nodeData, node) =>
handleChangeProblem( handleChangeProblem(
node, node,
problem problem
) )
" "
/> />
<div
class="flex center v-center"
style="width: 90px"
>
<el-button <el-button
type="danger" type="danger"
plain plain
circle @click="
@click="item.problems.splice(j, 1)" item.problems.splice(j, 1)
class="ml-10" "
v-if="j !== 0"
size="small"
> >
<template #icon> <template #icon>
<icon name="el-icon-Delete" /> <icon
name="el-icon-Delete"
/>
</template> </template>
删除问题
</el-button> </el-button>
<div class="ml-16"> <el-button
<span>{{ @click="handleAddProblem(item)"
problem.oneLevelContent plain
}}</span> type="primary"
<span>{{ v-if="j === 0"
problem.twoLevelContent size="small"
? " / " + ><template #icon>
problem.twoLevelContent <icon
: "" name="el-icon-Plus"
}}</span> /> </template
<span>{{ >添加问题</el-button
problem.threeLevelContent >
? " / " + </div>
problem.threeLevelContent
: ""
}}</span>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<div
class="flex center mb-20"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-button @click="handleAddProblem(item)"
><template #icon>
<icon name="el-icon-Plus" /> </template
>添加问题类型</el-button
>
</div>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
@ -423,7 +427,6 @@
item.subjectiveAspectCode === item.subjectiveAspectCode ===
SubjectiveAspect.OTHER SubjectiveAspect.OTHER
" "
style="margin-bottom: 0"
> >
<el-input <el-input
v-model="item.subjectiveAspectName" v-model="item.subjectiveAspectName"
@ -469,10 +472,8 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col <template v-if="form.checkStatus !== InspectCase.FALSE">
:span="12" <el-col :span="12">
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-form-item <el-form-item
label="督察措施" label="督察措施"
:prop="`blames[${index}].superviseMeasuresCode`" :prop="`blames[${index}].superviseMeasuresCode`"
@ -524,7 +525,8 @@
(item.protectRightsName = (item.protectRightsName =
dict.protectRights.filter( dict.protectRights.filter(
(item) => (item) =>
item.dictValue === val item.dictValue ===
val
)[0].dictLabel) )[0].dictLabel)
" "
> >
@ -537,57 +539,77 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> </template>
<el-form-item </el-row>
label="帮扶情况" </div>
:prop="`blames[${index}].assistCaseCode`" <div class="flex center" style="width: 100%">
v-if=" <el-button type="primary" plain @click="handleAddPersomal"
negative.problemSourcesCode !== ><template #icon>
ProblemSources.JWDC <icon name="el-icon-Plus" /> </template
" >添加涉及人员</el-button
> >
<el-radio-group </div>
v-model="item.assistCaseCode" </el-form-item>
@change=" <el-divider />
(val) => <el-form-item
(item.assistCaseName = label-position="top"
dict.assistCase.filter( prop="blameLeaders"
(item) => :rules="{
item.dictValue === val required: true,
)[0].dictLabel) message: '请添加涉及领导',
" }"
> >
<el-radio <div v-for="(item, index) in form.blameLeaders" :key="index">
v-for="item in dict.assistCase" <div class="flex v-center">
:key="item.dictCode" <h5>涉及领导{{ index + 1 }}</h5>
:value="item.dictValue" <el-button
>{{ item.dictLabel }}</el-radio type="danger"
plain
size="small"
@click="handleRemoveBlameLeader(index)"
text
class="ml-10"
>删除</el-button
> >
</el-radio-group> </div>
</el-form-item>
</el-col> <el-row style="background: #f9faff">
<el-col :span="12"> <el-col :span="24">
<el-form-item <el-form-item
label="帮扶起止时间" label="涉及人员"
:prop="`blames.${index}.assistTime`" :prop="`blameLeaders.${index}.blameIdCodes`"
v-if="item.assistCaseCode === AssistCase.YES" :rules="{
> required: true,
<el-date-picker message: '请选择涉及领导关联的涉及人员',
v-model="item.assistTime" trigger: ['blur'],
type="datetimerange" }"
start-placeholder="帮扶开始时间" >
end-placeholder="帮扶结束时间" <el-checkbox
value-format="YYYY-MM-DD HH:mm:ss" border
v-for="(obj, j) in form.blames.filter(
(obj) =>
obj.type === BlameType.PERSONAL &&
obj.blameIdCode
)"
:key="obj.blameIdCode"
:label="obj.blameName"
:value="obj.blameIdCode"
:checked="item.blameIdCodes.includes(obj.blameIdCode)"
@change="
(bool) =>
handleCheckboxChange(
item,
bool,
obj.blameIdCode
)
"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<div class="text-primary mb-10">涉及领导</div>
<el-row style="background: #f9faff">
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="涉及领导姓名" label="涉及领导姓名"
:prop="`blames.${index}.leadName`" :prop="`blameLeaders.${index}.leadName`"
:rules="{ :rules="{
required: true, required: true,
message: '请选择涉及领导', message: '请选择涉及领导',
@ -615,7 +637,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="警号" label="警号"
:prop="`blames.${index}.leadEmpNo`" :prop="`blameLeaders.${index}.leadEmpNo`"
:rules="{ :rules="{
required: true, required: true,
message: '请输入警号', message: '请输入警号',
@ -632,7 +654,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="身份证号码" label="身份证号码"
:prop="`blames.${index}.leadIdCode`" :prop="`blameLeaders.${index}.leadIdCode`"
:rules="{ :rules="{
required: true, required: true,
message: '请输入身份证号码', message: '请输入身份证号码',
@ -649,7 +671,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="责任类别" label="责任类别"
:prop="`blames.${index}.leadResponsibilityTypeCode`" :prop="`blameLeaders.${index}.leadResponsibilityTypeCode`"
:rules="{ :rules="{
required: true, required: true,
message: '请选择责任类别', message: '请选择责任类别',
@ -680,7 +702,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="处理结果" label="处理结果"
:prop="`blames.${index}.leadHandleResultCode`" :prop="`blameLeaders.${index}.leadHandleResultCode`"
:rules="{ :rules="{
required: true, required: true,
message: '请选择处理结果', message: '请选择处理结果',
@ -716,7 +738,7 @@
> >
<el-form-item <el-form-item
label="督察措施" label="督察措施"
:prop="`blames.${index}.leadMeasuresCode`" :prop="`blameLeaders.${index}.leadMeasuresCode`"
> >
<el-radio-group v-model="item.leadMeasuresCode"> <el-radio-group v-model="item.leadMeasuresCode">
<el-radio <el-radio
@ -753,7 +775,7 @@
> >
<el-form-item <el-form-item
label="维权容错" label="维权容错"
:prop="`blames.${index}.leadProtectRightsCode`" :prop="`blameLeaders.${index}.leadProtectRightsCode`"
> >
<el-radio-group <el-radio-group
v-model="item.leadProtectRightsCode" v-model="item.leadProtectRightsCode"
@ -776,21 +798,31 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</template>
</div> </div>
<div <div
class="flex center mb-20" class="flex center"
style="width: 100%" style="width: 100%"
v-if=" v-if="
form.accountabilityTarget !== form.accountabilityTarget !==
AccountabilityTarget.DEPARTMENT AccountabilityTarget.DEPARTMENT
" "
> >
<el-button type="primary" plain @click="handleAddPersomal" <el-button
><template #icon> <icon name="el-icon-Plus" /> </template type="primary"
>添加涉及人员</el-button plain
@click="handleAddBlameLeader"
><template #icon>
<icon name="el-icon-Plus" /> </template
>添加涉及领导</el-button
> >
</div> </div>
</el-form-item>
<el-divider />
</div>
<el-form-item
label-position="top"
v-if="form.accountabilityTarget !== AccountabilityTarget.PERSONAL"
>
<div v-for="(item, index) in form.blames" :key="index"> <div v-for="(item, index) in form.blames" :key="index">
<template v-if="item.type === BlameType.DEPARTMENT"> <template v-if="item.type === BlameType.DEPARTMENT">
<div class="flex between v-center"> <div class="flex between v-center">
@ -851,9 +883,7 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-radio-group <el-radio-group v-model="item.ivPersonTypeCode">
v-model="item.ivPersonTypeCode"
>
<el-radio :value="PersonType.POLICE" <el-radio :value="PersonType.POLICE"
>民警</el-radio >民警</el-radio
> >
@ -897,8 +927,9 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
v-if="form.checkStatus !== InspectCase.FALSE" v-if="form.checkStatus !== InspectCase.FALSE"
style="margin-bottom: 0"
> >
<el-row style="width: 100%"> <el-row style="width: 80%">
<el-col <el-col
:span="24" :span="24"
v-for="(problem, j) in item.problems" v-for="(problem, j) in item.problems"
@ -913,68 +944,58 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-tree-select <div
class="flex between"
style="width: 90%"
>
<problem-type-select
v-model="problem.threeLevelCode" v-model="problem.threeLevelCode"
:data="dictContent" @change="
:props="{ (node) =>
label: 'name',
value: 'code',
}"
node-key="code"
clearable
filterable
accordion
style="width: 420px"
@current-change="
(nodeData, node) =>
handleChangeProblem( handleChangeProblem(
node, node,
problem problem
) )
" "
/> />
<div
class="flex center v-center"
style="width: 90px"
>
<el-button <el-button
type="danger" type="danger"
plain plain
circle @click="
@click="item.problems.splice(j, 1)" item.problems.splice(j, 1)
class="ml-10" "
v-if="j !== 0"
size="small"
> >
<template #icon> <template #icon>
<icon name="el-icon-Delete" /> <icon
name="el-icon-Delete"
/>
</template> </template>
删除问题
</el-button> </el-button>
<div class="ml-16"> <el-button
<span>{{ @click="handleAddProblem(item)"
problem.oneLevelContent plain
}}</span> type="primary"
<span>{{ v-if="j === 0"
problem.twoLevelContent size="small"
? " / " + ><template #icon>
problem.twoLevelContent <icon
: "" name="el-icon-Plus"
}}</span> /> </template
<span>{{ >添加问题</el-button
problem.threeLevelContent >
? " / " + </div>
problem.threeLevelContent
: ""
}}</span>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<div
class="flex center mb-20"
v-if="form.checkStatus !== InspectCase.FALSE"
>
<el-button @click="handleAddProblem(item)"
><template #icon>
<icon name="el-icon-Plus" /> </template
>添加问题类型</el-button
>
</div>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
@ -1143,6 +1164,7 @@ 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([
"inspectCase", "inspectCase",
@ -1158,10 +1180,9 @@ const dict = catchSotre.getDicts([
"leadResponsibilityType", "leadResponsibilityType",
]); ]);
const dictContent = catchSotre.getDictContent();
const negative = inject("negative"); const negative = inject("negative");
const form = ref({}); const form = ref({});
getFormData(); getFormData();
watch(negative, () => { watch(negative, () => {
@ -1185,6 +1206,7 @@ function getFormData() {
? AccountabilityTarget.PERSONAL ? AccountabilityTarget.PERSONAL
: "", : "",
blames: negative.value.blames, blames: negative.value.blames,
blameLeaders: negative.value.blameLeaders,
files: negative.value.files || [], files: negative.value.files || [],
}; };
} }
@ -1204,6 +1226,16 @@ function handleAddProblem(blame) {
blame.problems.push({}); blame.problems.push({});
} }
function handleAddBlameLeader() {
form.value.blameLeaders.push({
blameIdCodes: [],
});
}
function handleRemoveBlameLeader(index) {
form.value.blameLeaders.splice(index, 1);
}
function handleChangeBlame(val, blame) { function handleChangeBlame(val, blame) {
const police = polices.value.filter((item) => item.empNo === val)[0]; const police = polices.value.filter((item) => item.empNo === val)[0];
blame.blameName = police.name; blame.blameName = police.name;
@ -1281,13 +1313,12 @@ function handleChangeCheckStatus(val, item) {
} }
function handleChangePolice(police, item) { function handleChangePolice(police, item) {
console.log(police) console.log(police);
item.blameName = police.name; item.blameName = police.name;
item.blameIdCode = police.idCode; item.blameIdCode = police.idCode;
item.ivPersonTypeCode = police.personType item.ivPersonTypeCode = police.personType;
} }
function handleChangeSubjectiveAspect(val, item) { function handleChangeSubjectiveAspect(val, item) {
if (val === SubjectiveAspect.OTHER) { if (val === SubjectiveAspect.OTHER) {
item.subjectiveAspectName = ""; item.subjectiveAspectName = "";
@ -1308,11 +1339,35 @@ function handleChangeProblem(node, problem) {
} }
} }
function handleCheckboxChange(blameLeader, bool, val) {
if (bool) {
blameLeader.blameIdCodes.push(val);
} else {
blameLeader.blameIdCodes.splice(
blameLeader.blameIdCodes.indexOf(val),
1
);
}
}
const formRef = ref(null); const formRef = ref(null);
async function validate() { async function validate() {
const flag = await formRef.value.validate(); const flag = await formRef.value.validate();
if (flag) { if (flag) {
let arr = [];
form.value.blameLeaders.forEach((item) => {
arr = arr.concat(item.blameIdCodes);
});
const blame = form.value.blames.filter(
(item) => !arr.includes(item.blameIdCode)
);
if (blame.length) {
throw new Error(
`涉及人员【${blame
.map((item) => item.blameName)
.join("、")}未关联领导`
);
}
return form.value; return form.value;
} }
} }

21
src/components/police-select.vue

@ -1,12 +1,7 @@
<template> <template>
<div class="flex gap"> <div class="flex gap">
<template <template v-if="props.hostLevel === HostLevel.FIRST">
v-if=" <depart-tree-select v-model="departId" :auth="false" />
props.hostLevel === HostLevel.FIRST ||
props.hostLevel === HostLevel.SECOND
"
>
<depart-tree-select v-model="departId" />
</template> </template>
<el-select-v2 <el-select-v2
v-model="value" v-model="value"
@ -23,7 +18,9 @@
<span style="color: #999; font-size: 12px" class="mr-8">{{ <span style="color: #999; font-size: 12px" class="mr-8">{{
item.empNo item.empNo
}}</span> }}</span>
<el-tag size="small" v-if="item.position">{{ item.position }}</el-tag> <el-tag size="small" v-if="item.position">{{
item.position
}}</el-tag>
</template> </template>
</el-select-v2> </el-select-v2>
</div> </div>
@ -46,8 +43,8 @@ const props = defineProps({
}, },
isLeader: { isLeader: {
type: Boolean, type: Boolean,
default: false default: false,
} },
}); });
const emit = defineEmits("update:modelValue", "change"); const emit = defineEmits("update:modelValue", "change");
@ -68,9 +65,9 @@ watch(departId, () => {
async function getPolices() { async function getPolices() {
if (departId.value) { if (departId.value) {
if (props.isLeader) { if (props.isLeader) {
polices.value = await listPoliceLeader(departId.value) polices.value = await listPoliceLeader(departId.value);
} else { } else {
polices.value = await listPoliceAll(departId.value) polices.value = await listPoliceAll(departId.value);
} }
} }
} }

53
src/components/problem-type-select.vue

@ -0,0 +1,53 @@
<template>
<div class="flex">
<el-tree-select
v-model="value"
:data="dictContent"
:props="{
label: 'name',
value: 'code',
}"
node-key="code"
clearable
filterable
accordion
style="width: 420px"
@current-change="handleChange"
/>
<div class="ml-16">
<span>{{ activeNode.parent?.parent?.label ? activeNode.parent.parent.label + ' / ': '' }}</span>
<span>{{ activeNode.parent?.label ? activeNode.parent.label + ' / ': '' }}</span>
<span>{{ activeNode.label }}</span>
</div>
</div>
</template>
<script setup>
import useCatchStore from "@/stores/modules/catch";
const catchSotre = useCatchStore();
const dictContent = catchSotre.getDictContent();
const activeNode = ref({})
const props = defineProps({
modelValue: {
type: String
}
})
const emit = defineEmits(['update:modelValue', 'change'])
const value = ref(props.modelValue)
watch(props.modelValue, (val) => {
value.value = val
})
watch(value, (val) => {
emit('update:modelValue', val)
})
function handleChange(nodeData, node) {
activeNode.value = node
emit('change', node)
}
</script>
<style lang="scss" scoped>
</style>

24
src/stores/modules/catch.ts

@ -1,7 +1,7 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { listDictDataAll, listDictProblemSourceTree } from '@/api/system/dict' import { listDictDataAll, listDictProblemSourceTree } from '@/api/system/dict'
import { listDictContentTree } from '@/api/system/dictContent' import { listDictContentTree } from '@/api/system/dictContent'
import { departTree } from '@/api/system/depart' import { departTree, departTreeAll } from '@/api/system/depart'
import { listFlowNode } from '@/api/work/flowNode' import { listFlowNode } from '@/api/work/flowNode'
export interface CatchState { export interface CatchState {
@ -9,12 +9,16 @@ export interface CatchState {
dictContent: any[], dictContent: any[],
dictProblemSources: any[], dictProblemSources: any[],
departs: any[], departs: any[],
departsAll: any[],
flowNodes: any[] flowNodes: any[]
} }
// 判定是否已请求缓存 // 判定是否已请求缓存
let departCatchFlag = true; let departCatchFlag = true;
let departAllCatchFlag = true;
const dictCatchFlag = {}; const dictCatchFlag = {};
let dictProblemSourcesFlag = true; let dictProblemSourcesFlag = true;
const useCatchStore = defineStore({ const useCatchStore = defineStore({
id: 'catch', id: 'catch',
state: ():CatchState => ({ state: ():CatchState => ({
@ -22,6 +26,7 @@ const useCatchStore = defineStore({
dictContent: [], dictContent: [],
dictProblemSources: [], dictProblemSources: [],
departs: [], departs: [],
departsAll: [],
flowNodes: [] flowNodes: []
}), }),
getters: {}, getters: {},
@ -100,6 +105,23 @@ const useCatchStore = defineStore({
} }
return this.departs; return this.departs;
}, },
getDepartsAll() {
if (!this.departsAll.length && departAllCatchFlag) {
departAllCatchFlag = false
const refresh = async () => {
const res = await Promise.allSettled<Promise<any>>([departTreeAll()])
res.forEach((item) => {
if (item.status == 'fulfilled') {
item.value.forEach(item => {
this.departsAll.push(item)
})
}
})
}
refresh()
}
return this.departsAll;
},
getFlowNodes() { getFlowNodes() {
if (!this.flowNodes.length) { if (!this.flowNodes.length) {
const refresh = async () => { const refresh = async () => {

2
src/utils/util.ts

@ -333,7 +333,7 @@ export function getFileType(fileName) {
if (fileName.endsWith('.mp3') || fileName.endsWith('.m4a') || fileName.endsWith('.wav')) { if (fileName.endsWith('.mp3') || fileName.endsWith('.m4a') || fileName.endsWith('.wav')) {
return FileType.MP3; return FileType.MP3;
} }
if (fileName.endsWith('.mp4')) { if (fileName.endsWith('.mp4') || fileName.endsWith('.mpeg')) {
return FileType.MP4; return FileType.MP4;
} }
return "unknown"; return "unknown";

5
src/views/sensitivePerception/DictContent.vue

@ -40,7 +40,7 @@
:href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`" :href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`"
target="__blank" target="__blank"
> >
<icon name="local-icon-pdf" :size="48" /> <icon name="local-icon-pdf" :size="38" />
<span>问题赋分机制.pdf</span> <span>问题赋分机制.pdf</span>
</a> </a>
</div> </div>
@ -288,10 +288,11 @@ function getScoreRange(row) {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.file-link { .file-link {
font-size: 18px; font-size: 16px;
text-decoration: none; text-decoration: none;
color: #19257d; color: #19257d;
padding: 0 8px; padding: 0 8px;
border-radius: 8px;
&:hover { &:hover {
background-color: #eee; background-color: #eee;
} }

45
src/views/work/Query.vue

@ -225,7 +225,7 @@
</header> </header>
<main> <main>
<div class="table-container" v-loading="loading"> <div class="table-container" v-loading="loading">
<el-table :data="list"> <el-table :data="list" @sort-change="handleTableSort" ref="tableRef">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="{ row }"> <template #default="{ row }">
<div class="row mt-10"> <div class="row mt-10">
@ -241,10 +241,6 @@
<label>问题发生时间</label> <label>问题发生时间</label>
<span>{{ row.happenTime || "/" }}</span> <span>{{ row.happenTime || "/" }}</span>
</div> </div>
<div class="col col-6">
<label>问题录入时间</label>
<span>{{ row.crtTime }}</span>
</div>
</div> </div>
<div class="row mt-10"> <div class="row mt-10">
<div class="col col-6"> <div class="col col-6">
@ -293,10 +289,17 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
label="问题录入时间"
prop="crtTime"
width="150"
sortable="custom"
/>
<el-table-column <el-table-column
label="问题发现时间" label="问题发现时间"
prop="discoveryTime" prop="discoveryTime"
width="150" width="150"
sortable="custom"
/> />
<el-table-column <el-table-column
label="问题来源" label="问题来源"
@ -313,17 +316,8 @@
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column
label="是否属实"
prop="checkStatusName"
width="100"
align="center"
/>
<el-table-column
label="涉及单位"
prop="involveDepartName"
show-overflow-tooltip
/>
<el-table-column label="办理单位" show-overflow-tooltip> <el-table-column label="办理单位" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span <span
@ -332,6 +326,12 @@
> >
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
label="是否属实"
prop="checkStatusName"
width="100"
align="center"
/>
<el-table-column <el-table-column
label="流程限时" label="流程限时"
width="150" width="150"
@ -758,12 +758,25 @@ function getList() {
}); });
} }
function handleTableSort(orderObj) {
if (orderObj.order) {
query.value.order = orderObj.order
query.value.orderProp = orderObj.prop
} else {
query.value.order = ''
query.value.orderProp = ''
}
getList()
}
const tableRef = ref()
function reset() { function reset() {
query.value = { query.value = {
current: 1, current: 1,
size: 10, size: 10,
responderKey: "name", responderKey: "name",
}; };
tableRef.value.clearSort()
getList(); getList();
// //
router.push("/query"); router.push("/query");

Loading…
Cancel
Save