Browse Source

feat: 涉访涉诉初核办理

feature/tsjb-1.0
wxc 4 weeks ago
parent
commit
f68ab60d18
  1. 4
      package.json
  2. 9
      src/api/data/complaintCollection.ts
  3. 120
      src/components/negative/dialog.vue
  4. 62
      src/components/negative/verify-description.vue
  5. 2457
      src/components/negative/verify-sfss.vue

4
package.json

@ -33,9 +33,11 @@
"@vue-office/docx": "^1.6.0", "@vue-office/docx": "^1.6.0",
"@vue-office/excel": "^1.7.11", "@vue-office/excel": "^1.7.11",
"@vueup/vue-quill": "^1.2.0", "@vueup/vue-quill": "^1.2.0",
"@vueuse/core": "^10.11.0",
"amfe-flexible": "^2.2.1", "amfe-flexible": "^2.2.1",
"baidu-map-vue3": "^0.4.9", "baidu-map-vue3": "^0.4.9",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"dayjs": "^1.11.20",
"echarts": "^5.4.3", "echarts": "^5.4.3",
"element-plus": "^2.8.8", "element-plus": "^2.8.8",
"flv.js": "^1.6.2", "flv.js": "^1.6.2",
@ -63,7 +65,7 @@
"amfe-flexible": "^2.2.1", "amfe-flexible": "^2.2.1",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"postcss-pxtorem": "^6.1.0", "postcss-pxtorem": "^6.1.0",
"sass": "^1.69.7", "sass": "^1.99.0",
"unplugin-auto-import": "^0.17.3", "unplugin-auto-import": "^0.17.3",
"unplugin-vue-components": "^0.26.0", "unplugin-vue-components": "^0.26.0",
"vite": "^5.0.8", "vite": "^5.0.8",

9
src/api/data/complaintCollection.ts

@ -137,4 +137,13 @@ export function getComplaintCollectionDetail(body) {
}); });
} }
/**
*
*/
export function initialReview(body) {
return request.post({
url: `/data/complaintCollection/initialReview`,
body
});
}

120
src/components/negative/dialog.vue

@ -166,7 +166,14 @@
" "
> >
<!-- 核查办理--> <!-- 核查办理-->
<negative-verify-sfss
v-if="isComplaintReport"
ref="componentRef"
@stage-change="handleComplaintStageChange"
@submit="handleSubmitExecute"
/>
<negative-verify <negative-verify
v-else
ref="componentRef" ref="componentRef"
@submit="handleSubmitExecute" @submit="handleSubmitExecute"
/> />
@ -320,7 +327,7 @@
>保存抽检结果</el-button >保存抽检结果</el-button
> >
<div v-if="!disabled"> <div v-if="!disabled">
<template v-for="item in flowActions" :key="item.actionKey"> <template v-for="item in displayFlowActions" :key="item.actionKey">
<template <template
v-if=" v-if="
!negative.extensionApplyFlag && !negative.extensionApplyFlag &&
@ -365,7 +372,7 @@
</template> </template>
</div> </div>
</footer> </footer>
<template v-for="item in flowActions" :key="item.actionKey"> <template v-for="item in displayFlowActions" :key="item.actionKey">
<template v-if="item.actionKey.includes('apply_completion')"> <template v-if="item.actionKey.includes('apply_completion')">
<negative-apply-completion <negative-apply-completion
:ref="(el) => setActionItemRef(item.actionKey, el)" :ref="(el) => setActionItemRef(item.actionKey, el)"
@ -398,7 +405,7 @@
/> />
</template> </template>
</template> </template>
<template v-if="confirmationCompletionFlag && flowActions.length"> <template v-if="confirmationCompletionFlag && displayFlowActions.length">
<negative-confirmation-completion <negative-confirmation-completion
@submit="handleSubmitExecute" @submit="handleSubmitExecute"
ref="confirmationCompletionRef" ref="confirmationCompletionRef"
@ -413,6 +420,7 @@ 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 {getDictLable} from "@/utils/util";
import { initialReview, saveInvolveJson } from "@/api/data/complaintCollection";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
@ -462,12 +470,48 @@ const remainingDuration = ref(0);
const maxDuration = ref(0); const maxDuration = ref(0);
const flowActions = ref([]); const flowActions = ref([]);
const components = ref([]); const components = ref([]);
const COMPLAINT_REPORT_SOURCE_TYPE = "2";
const LOCAL_INITIAL_REVIEW_ACTION_KEY = "initial_review";
const STAGE_INITIAL = "0";
const STAGE_COMPLETION = "1";
type ProcessingStage = typeof STAGE_INITIAL | typeof STAGE_COMPLETION;
const currentComplaintStage = ref<ProcessingStage>(STAGE_COMPLETION);
const isComplaintReport = computed(
() => negative.value?.sourceType === COMPLAINT_REPORT_SOURCE_TYPE
);
const displayFlowActions = computed(() => {
if (!isComplaintReport.value) {
return flowActions.value;
}
if (currentComplaintStage.value === STAGE_INITIAL) {
return [
{
actionKey: FlowActionEnum.SAVE,
buttonLabel: "保存信息",
buttonType: "primary",
plain: true,
validateForm: false,
},
{
actionKey: LOCAL_INITIAL_REVIEW_ACTION_KEY,
buttonLabel: "初核反馈",
buttonType: "primary",
plain: false,
validateForm: true,
},
];
}
return flowActions.value;
});
watch( watch(
() => props.id, () => props.id,
() => { () => {
getDetails(); getDetails();
verifyEditFlag.value = false; verifyEditFlag.value = false;
formData.value = {}; formData.value = {};
currentComplaintStage.value = STAGE_COMPLETION;
} }
); );
@ -475,7 +519,11 @@ const confirmationCompletionFlag = ref(false);
function getDetails() { function getDetails() {
loading.value = true; loading.value = true;
getNegativeDetails(props.id, work?.value.workId).then((data) => { getNegativeDetails(props.id, work?.value.workId).then((data) => {
negative.value = data.negative; negative.value = {
...data.negative,
complaintCollectionPageDTO: data.complaintCollectionPageDTO,
currentRow: data.complaintCollectionPageDTO || {},
};
console.log('negative',negative) console.log('negative',negative)
getConfinementData(); getConfinementData();
getSuperviseReportFun(data.negative.reportNumber) getSuperviseReportFun(data.negative.reportNumber)
@ -602,6 +650,14 @@ async function handleExecute(action, data) {
data = componentRef.value.getData(); data = componentRef.value.getData();
} }
} }
if (
isComplaintReport.value &&
action.actionKey === FlowActionEnum.APPLY_COMPLETION &&
componentRef.value?.getStage?.() === STAGE_INITIAL
) {
feedback.msgWarning("初核阶段请先保存初核内容,再切换到办结阶段提交办结");
return;
}
if (action.openDialog) { if (action.openDialog) {
if ( if (
confirmationCompletionFlag.value && confirmationCompletionFlag.value &&
@ -625,6 +681,26 @@ async function handleExecute(action, data) {
verifyEditFlag.value = false; verifyEditFlag.value = false;
} }
try { try {
if (isComplaintReport.value && action.actionKey === FlowActionEnum.SAVE) {
const formData = componentRef.value.getData();
const stage = componentRef.value?.getStage?.() || currentComplaintStage.value;
if (stage === STAGE_INITIAL) {
await submitComplaintInitialReview(formData);
} else {
await saveComplaintVerifyData(formData);
}
feedback.msgSuccess("操作成功");
getDetails();
return;
}
if (isComplaintReport.value && action.actionKey === LOCAL_INITIAL_REVIEW_ACTION_KEY) {
await submitComplaintInitialReview(data);
currentComplaintStage.value = STAGE_COMPLETION;
componentRef.value?.setStage?.(STAGE_COMPLETION);
feedback.msgSuccess("操作成功");
getDetails();
return;
}
await negativeExecute(props.id, { await negativeExecute(props.id, {
workId: work?.value.workId, workId: work?.value.workId,
actionKey: action.actionKey, actionKey: action.actionKey,
@ -649,6 +725,10 @@ async function handleSubmitExecute(data) {
handleExecute(activeAction.value, data); handleExecute(activeAction.value, data);
} }
function handleComplaintStageChange(stage: ProcessingStage) {
currentComplaintStage.value = stage;
}
function handleFav() { function handleFav() {
if (isFav.value) { if (isFav.value) {
delFav(props.id); delFav(props.id);
@ -699,6 +779,38 @@ async function handleUpdateVerify() {
verifyEditFlag.value = !verifyEditFlag.value; verifyEditFlag.value = !verifyEditFlag.value;
} }
async function saveComplaintVerifyData(data) {
const payload = {
blames: data?.blames || [],
blameLeaders: data?.blameLeaders || [],
files: data?.files || [],
};
await saveInvolveJson({
complaintId: data?.complaintId,
checkStatusCode: data?.checkStatusCode,
checkStatusName: data?.checkStatusName,
checkStatusDesc: data?.checkStatusDesc,
accountabilityTarget: data?.accountabilityTarget,
involveDepartId: data?.involveDepartId,
involveDepartName: data?.involveDepartName,
completionStatus: data?.completionStatus,
publicRecognition: data?.publicRecognition,
caseNumber: data?.caseNumber,
involveJson: JSON.stringify(payload),
files: data?.files || [],
});
}
async function submitComplaintInitialReview(data) {
await initialReview({
complaintId: data?.complaintId,
initWorkDes: data?.initWorkDes,
initProblemPlan: data?.initProblemPlan,
initVerdict: data?.initVerdict,
});
}
defineExpose({ defineExpose({
spotCheck, spotCheck,
}); });

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

@ -48,6 +48,34 @@
</div> </div>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item
title="初核信息"
name="initialReview"
v-if="showInitialReviewInfo"
>
<div class="row">
<div class="col col-12">
<label>初核时间</label>
<span>{{ initialReviewInfo.gwf2 || "/" }}</span>
</div>
<div class="col col-12">
<label>初核状态</label>
<span>{{ getInitialReviewStatusLabel(initialReviewInfo.gwf3) }}</span>
</div>
<div class="col col-24">
<label>初核工作开展情况</label>
<span>{{ initialReviewInfo.initWorkDes || "/" }}</span>
</div>
<div class="col col-24">
<label>初核发现的问题及下一步工作计划</label>
<span>{{ initialReviewInfo.initProblemPlan || "/" }}</span>
</div>
<div class="col col-24">
<label>初核结论</label>
<span>{{ getDictLable(dict.checkStatus, initialReviewInfo.initVerdict) || initialReviewInfo.initVerdict || "/" }}</span>
</div>
</div>
</el-collapse-item>
<el-collapse-item <el-collapse-item
title="信访情况" title="信访情况"
name="mail" name="mail"
@ -338,6 +366,7 @@ import {getConfinementListAll} from "@/api/work/confinement";
const dict = useCatchStore().getDicts([ const dict = useCatchStore().getDicts([
"accountabilityTarget", "accountabilityTarget",
"personType", "personType",
"checkStatus",
"verifySituation", "verifySituation",
"verifyFileSituation", "verifyFileSituation",
]); ]);
@ -350,6 +379,39 @@ const activeNames = ref([
"mail" "mail"
]); ]);
let negative = inject("negative"); let negative = inject("negative");
const COMPLAINT_REPORT_SOURCE_TYPE = "2";
const initialReviewInfo = computed(() => {
const currentRow = negative.value?.currentRow || {};
return {
gwf2: currentRow?.gwf2 || negative.value?.gwf2 || "",
gwf3: currentRow?.gwf3 || negative.value?.gwf3 || "",
initWorkDes: currentRow?.initWorkDes || negative.value?.initWorkDes || "",
initProblemPlan: currentRow?.initProblemPlan || negative.value?.initProblemPlan || "",
initVerdict: currentRow?.initVerdict || negative.value?.initVerdict || "",
};
});
const showInitialReviewInfo = computed(() => {
if (String(negative.value?.sourceType || "") !== COMPLAINT_REPORT_SOURCE_TYPE) {
return false;
}
return Boolean(
initialReviewInfo.value.gwf2 ||
initialReviewInfo.value.gwf3 ||
initialReviewInfo.value.initWorkDes ||
initialReviewInfo.value.initProblemPlan ||
initialReviewInfo.value.initVerdict
);
});
function getInitialReviewStatusLabel(status) {
const code = String(status || "");
if (code === "0") return "未初核";
if (code === "1") return "已初核";
if (code === "2") return "超时上传";
return "/";
}
console.log('negative.value',negative.value) console.log('negative.value',negative.value)

2457
src/components/negative/verify-sfss.vue

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save