Browse Source

审批人记忆功能

main
buaixuexideshitongxue 2 months ago
parent
commit
24acfc8a10
  1. 69
      src/components/reportAudit/finish.vue
  2. 43
      src/components/reportAudit/start.vue
  3. 46
      src/utils/lastChoice.ts
  4. 2
      src/views/entryWindow/index.vue
  5. 4
      src/views/report/edit/controlPrice.vue
  6. 2
      src/views/work/work.vue

69
src/components/reportAudit/finish.vue

@ -6,13 +6,13 @@ import {listPolice} from "@/api/system/police";
import {getList,save,delCommon} from '@/api/commonOpinions';
import useCatchStore from "@/stores/modules/catch";
import useUserStore from "@/stores/modules/user";
import { saveLastChoice, loadLastChoice } from '@/utils/lastChoice';
const userStore = useUserStore();
const props = defineProps(['dialog','reportId','node','isAudit'])
const emits = defineEmits(['submitFeedback',"closeFun"])
const loading =ref(false)
const catchSotre = useCatchStore();
const departs = catchSotre.getDeparts() ;
const formData = ref({
isInform:'1'
@ -45,6 +45,7 @@ const flowNodes = ref([
value:'audit'
}
])
const silentUnitChange = ref(false);
const getNodesFun = (val)=>{
let data = [];
@ -141,7 +142,7 @@ function getPoliceList() {
});
loading.value=false
}
getPoliceList()
// getPoliceList()
//
const commonList =ref([])
@ -206,12 +207,72 @@ const submitFun = async ()=>{
//nextNode
const res = await auditReport(formData.value);
// === ===
try {
const curUserId = userStore?.user?.userName || userStore?.user?.id || '';
const nodeKey = formData.value.nextNode || 'default';
saveLastChoice(curUserId, nodeKey, {
approverUnitId: formData.value.approverUnitId,
approverUnit: formData.value.approverUnit,
approverId: formData.value.approverId,
approver: formData.value.approver,
});
} catch (e) {}
feedback.msgSuccess("操作成功");
emits('submitFeedback',true)
closeAdd()
}
// key使 nextNode
const nodeKeyOf = (nodeOverride) => nodeOverride || formData.value.nextNode || 'default';
//
const handleFlowChange = async (node) => {
debugger
//
formData.value.nextNode = node;
// 2) ID +
const uid = userStore?.user?.userName || userStore?.user?.id || '';
const hint = loadLastChoice(uid, nodeKeyOf(node));
if (!hint){
// formData.value.approverUnitId = null;
// formData.value.approverUnit = null;
// formData.value.approverId = null;
// formData.value.approver = null;
return;
}
// watcher
silentUnitChange.value = true;
// 3)
formData.value.approverUnitId = hint.approverUnitId ?? null;
formData.value.approverUnit = hint.approverUnit ?? null;
// 4)
if (hint.approverUnitId) {
query.value.departId = hint.approverUnitId;
loading.value = true;
try {
const data = await listPolice(query.value);
polices.value = data?.records || [];
} finally {
loading.value = false;
delete query.value.departId;
}
}
// 5)
formData.value.approverId = hint.approverId ?? null;
formData.value.approver = hint.approver ?? null;
//
silentUnitChange.value = false;
};
watch(()=>props.dialog,(val)=>{
debugger
if(val){
@ -268,7 +329,7 @@ watch(()=>formData.value.approverId,(val)=>{
<depart-tree-select :auth="false" v-model="formData.approverUnitId" :size="'default'" placeholder="" clearable/>
</el-form-item>
<el-form-item label="办理流程" prop="nextNode" :rules="{ required: true, message: '请选择办理流程', trigger: 'blur' }">
<el-select v-model="formData.nextNode">
<el-select v-model="formData.nextNode" @change="handleFlowChange">
<el-option v-for="(item,index) in flowNodes" :value="item.value" :label="item.label" :key="index"></el-option>
</el-select>
</el-form-item>

43
src/components/reportAudit/start.vue

@ -7,9 +7,11 @@
import useCatchStore from "@/stores/modules/catch";
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
const props = defineProps(['dialog','reportId','nextNode','message',"isWarning","isCityAudit","reportProject"])
const props = defineProps(['dialog','reportId','nextNode','message',"isWarning","isCityAudit","reportProject", 'currentNode'])
const emits = defineEmits(['submitFeedback',"closeFun"])
import { getDictValue } from "@/utils/util";
import { saveLastChoice, loadLastChoice } from '@/utils/lastChoice';
const catchSotre = useCatchStore();
const dict = catchSotre.getDicts(["AuditUnitPresetting","ReviewePresetSetting"]);
@ -111,6 +113,18 @@
const res = await auditReport(formData.value);
}
// === ===
try {
const curUserId = userStore?.user?.userName || userStore?.user?.id || '';
const nodeKey = props.currentNode || props.nextNode || 'default';
saveLastChoice(curUserId, nodeKey, {
approverUnitId: formData.value.approverUnitId,
approverUnit: formData.value.approverUnit,
approverId: formData.value.approverId,
approver: formData.value.approver,
});
} catch (e) {}
feedback.msgSuccess("操作成功");
emits('submitFeedback',true)
closeAdd()
@ -200,9 +214,36 @@
}
}
}
// === ===
try {
const curUserId = userStore?.user?.userName || userStore?.user?.id || '';
const nodeKey = props.currentNode || props.nextNode || 'default';
const hint = loadLastChoice(curUserId, nodeKey);
if (hint) {
//
if (hint.approverUnitId) {
formData.value.approverUnitId = hint.approverUnitId;
formData.value.approverUnit = hint.approverUnit;
//
if (props.isWarning !== 'inform') {
query.value.departId = hint.approverUnitId;
getPoliceList();
delete query.value.departId;
}
}
//
if ( hint.approverId) {
formData.value.approverId = hint.approverId;
formData.value.approver = hint.approver;
}
}
} catch (e) {}
})
watch(

46
src/utils/lastChoice.ts

@ -0,0 +1,46 @@
// 记忆“上次选择的单位和人员”——按 用户ID + 节点 分桶
export type WfNode =
| 'initial' | 'review' | 'first' | 'second' | 'third'
| 'original' | 'audit' | 'end' | string;
const LS_KEY = 'wf_last_choice_v1';
function keyOf(userId: string | number, node: WfNode) {
return `${userId ?? ''}__${node ?? ''}`;
}
function loadAll(): Record<string, any> {
try {
return JSON.parse(localStorage.getItem(LS_KEY) || '{}');
} catch {
return {};
}
}
function saveAll(map: Record<string, any>) {
localStorage.setItem(LS_KEY, JSON.stringify(map));
}
export function saveLastChoice(
userId: string | number,
node: WfNode,
payload: {
approverUnitId?: string | number;
approverUnit?: string;
approverId?: string | number;
approver?: string;
}
) {
const map = loadAll();
map[keyOf(userId, node)] = { ...payload, updatedAt: Date.now() };
saveAll(map);
}
export function loadLastChoice(userId: string | number, node: WfNode) {
const map = loadAll();
return map[keyOf(userId, node)];
}
export function clearAllLastChoice() {
localStorage.removeItem(LS_KEY);
}

2
src/views/entryWindow/index.vue

@ -449,7 +449,7 @@ const isAdminShow = ()=>{
{{timeFormat(row.projectApprovalTime)}}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" min-width="160px">
<el-table-column label="操作" fixed="right" min-width="260px">
<template #default="{ row }">
<el-button link type="primary" v-if="row.applicantId === uid && row.isRecessed == 1" @click="getDetail(row,'edit')">编辑</el-button>

4
src/views/report/edit/controlPrice.vue

@ -834,7 +834,7 @@ watch(()=>formData.value.review.thirdlyMoney,(val)=>{
<el-row>
<el-col :span="6">
<el-form-item label="报审类型" prop="reportType">
<el-select disabled="true" v-model="formData.project.reportType">
<el-select :disabled="true" v-model="formData.project.reportType">
<el-option value="项目控制价" label="项目控制价"></el-option>
<el-option value="结算项目" label="结算项目"></el-option>
</el-select>
@ -1384,7 +1384,7 @@ watch(()=>formData.value.review.thirdlyMoney,(val)=>{
<report-file :preview="preview" :activeFile="actionRow" @closeFile="closeFile"/>
<report-audit @submitFeedback="submitFeedback" @closeFun="closeAudit" :reportId="formData.project.id" :isCityAudit="isCityAudit"
:dialog="dialog"/>
:dialog="dialog" :currentNode="formData.project.node"/>
<report-audit-finish @submitFeedback="submitFeedback" @closeFun="closeAudit" :node="formData.project.node"
:reportId="formData.project.id" :dialog="finishDialog" :isAudit="true"></report-audit-finish>
<report-audit-reject @submitFeedback="submitFeedback" @closeFun="closeAudit" :node="formData.project.node"

2
src/views/work/work.vue

@ -54,7 +54,7 @@ const getWorkTabFun = async () => {
}
//
const rowWorkClick = (row) => {
console.log('initial',row.flowCode)
console.log('当前待办项目节点',row.flowCode)
let isEnd = row.reportType === "结算项目";
if(row.isWarning){

Loading…
Cancel
Save