✨ MK公开页、预结算体验优化、地图选址与认证密码规则完善

This commit is contained in:
2026-09-22 12:06:48 +08:00
parent 57368f0179
commit ac87208ba9
41 changed files with 1882 additions and 391 deletions
+46 -18
View File
@@ -143,7 +143,8 @@
:status="oaSyncProgressStatus"
:stroke-width="12"
/>
<div class="oa-sync-meta">
<div class="oa-sync-meta" v-if="oaSyncStage === 'clear'">当前阶段:{{ oaSyncStageLabel }}</div>
<div class="oa-sync-meta" v-else>
当前阶段:{{ oaSyncStageLabel }},第 {{ oaSyncProgress.current || 0 }} / {{ oaSyncTotalPage }} 页
</div>
<div class="oa-sync-stats">
@@ -177,6 +178,7 @@ import {
getDeptTree,
syncOaCompany,
syncOaDepartment,
clearNonTopDept,
} from '@/api/system/dept';
import { getLeaderList } from '@/api/system/user';
import { getList as getCustomerArchiveList } from '@/api/vehicle/customer-archive';
@@ -215,6 +217,7 @@ export default {
oaSyncCancelled: false,
oaSyncStatus: 'running',
oaSyncStage: 'company',
oaSyncClearNonTop: false,
oaSyncController: null,
oaSyncProgress: {
current: 0,
@@ -287,8 +290,9 @@ export default {
return;
}
const parentId = this.normalizeParentId(this.form?.parentId);
// 顶级组织不选择上级时,编码不依赖上级编码
if (!parentId) {
callback(new Error('请先选择上级组织'));
callback();
return;
}
if (!this.parentDept || String(this.parentDept.id) !== String(parentId)) {
@@ -429,13 +433,6 @@ export default {
props: {
label: 'title',
},
rules: [
{
required: true,
message: '请选择上级组织',
trigger: 'click',
},
],
},
{
label: '所属租户',
@@ -520,6 +517,9 @@ export default {
return '自动同步组织';
},
oaSyncStageLabel() {
if (this.oaSyncStage === 'clear') {
return '清除非顶级组织';
}
return this.oaSyncStage === 'department' ? '同步部门' : '同步公司';
},
oaSyncTotalPage() {
@@ -555,21 +555,34 @@ export default {
},
methods: {
handleOaOrgSync() {
this.$confirm('确定从OA先同步公司、再同步部门?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
this.startOaOrgSync();
});
this.$confirm(
'是否清除非顶级组织?选择“是”将先删除顶级以外的组织后再同步;选择“否”则直接同步。',
'提示',
{
confirmButtonText: '是',
cancelButtonText: '否',
distinguishCancelAndClose: true,
closeOnClickModal: false,
type: 'warning',
}
)
.then(() => {
this.startOaOrgSync(true);
})
.catch(action => {
if (action === 'cancel') {
this.startOaOrgSync(false);
}
});
},
startOaOrgSync() {
startOaOrgSync(clearNonTop) {
this.oaSyncLoading = true;
this.oaSyncVisible = true;
this.oaSyncRunning = true;
this.oaSyncCancelled = false;
this.oaSyncStatus = 'running';
this.oaSyncStage = 'company';
this.oaSyncClearNonTop = !!clearNonTop;
this.oaSyncStage = clearNonTop ? 'clear' : 'company';
this.oaSyncController = new AbortController();
this.oaSyncProgress = {
current: 0,
@@ -607,6 +620,14 @@ export default {
},
async runOaOrgSyncPages() {
try {
if (this.oaSyncClearNonTop) {
this.oaSyncStage = 'clear';
await clearNonTopDept(this.oaSyncController?.signal);
if (this.oaSyncCancelled) {
this.oaSyncStatus = 'cancelled';
return;
}
}
this.oaSyncStage = 'company';
await this.runOaOrgSyncStage(syncOaCompany);
if (this.oaSyncCancelled) {
@@ -821,6 +842,11 @@ export default {
.filter(Boolean);
return result.length ? result.join('、') : '-';
},
normalizeTopParent(row) {
if (!this.normalizeParentId(row?.parentId)) {
row.parentId = 0;
}
},
isRootDept(row) {
return row && (row.parentId === 0 || String(row.parentId) === '0');
},
@@ -836,6 +862,7 @@ export default {
row.tenantId = row.tenantId || this.userInfo.tenantId || website.tenantId;
row.deptCode = String(row.deptCode || '').trim();
row.leaderId = func.join(row.leaderId);
this.normalizeTopParent(row);
if (Number(row.deptCategory) === 6 && !row.carrierCustomerId) {
this.$message.warning('请选择承运商');
loading();
@@ -865,6 +892,7 @@ export default {
row.tenantId = row.tenantId || this.userInfo.tenantId || website.tenantId;
row.deptCode = String(row.deptCode || '').trim();
row.leaderId = func.join(row.leaderId);
this.normalizeTopParent(row);
if (Number(row.deptCategory) === 6 && !row.carrierCustomerId) {
this.$message.warning('请选择承运商');
loading();
+10 -4
View File
@@ -205,7 +205,7 @@
type="password"
show-password
autocomplete="new-password"
placeholder="请输入登录密码"
placeholder="大于8位,含字母、数字、特殊字符.!@#$%^&*"
/>
</el-form-item>
</el-col>
@@ -332,7 +332,12 @@
</el-col>
<el-col :span="24">
<el-form-item label="新密码" prop="password">
<el-input v-model="passwordForm.password" type="password" show-password />
<el-input
v-model="passwordForm.password"
type="password"
show-password
placeholder="大于8位,含字母、数字、特殊字符.!@#$%^&*"
/>
</el-form-item>
</el-col>
<el-col :span="24">
@@ -424,6 +429,7 @@ import { mapGetters } from 'vuex';
import { h } from 'vue';
import { getToken } from '@/utils/auth';
import { downloadXls } from '@/utils/util';
import { validateLoginPassword } from '@/utils/validate';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import func from '@/utils/func';
@@ -487,8 +493,7 @@ export default {
passwordForm: {},
passwordRules: {
password: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ min: 6, max: 32, message: '密码长度在6到32个字符', trigger: 'blur' },
{ required: true, validator: validateLoginPassword, trigger: 'blur' },
],
password2: [
{ required: true, message: '请再次输入新密码', trigger: 'blur' },
@@ -497,6 +502,7 @@ export default {
},
userRules: {
account: [{ required: true, message: '请输入账号名', trigger: 'blur' }],
password: [{ required: true, validator: validateLoginPassword, trigger: 'blur' }],
realName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
deptId: [{ required: true, message: '请选择所属组织', trigger: 'change' }],
+14 -1
View File
@@ -91,7 +91,7 @@
<el-input
v-model="passwordForm.newPassword"
type="password"
placeholder="请输入新密码"
placeholder="大于8位,含字母、数字、特殊字符.!@#$%^&*"
show-password
>
<template #prefix>
@@ -143,6 +143,7 @@
import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
import md5 from 'js-md5';
import { sensitive } from '@/utils/sensitive';
import { isValidLoginPassword, LOGIN_PASSWORD_RULE_MESSAGE } from '@/utils/validate';
import {
Plus,
Bell,
@@ -259,6 +260,18 @@ export default {
},
// 提交密码修改
submitPassword() {
if (!this.passwordForm.newPassword || !this.passwordForm.newPassword1) {
this.$message.warning('请输入新密码和确认密码');
return;
}
if (this.passwordForm.newPassword !== this.passwordForm.newPassword1) {
this.$message.warning('两次输入的新密码不一致');
return;
}
if (!isValidLoginPassword(this.passwordForm.newPassword)) {
this.$message.warning(LOGIN_PASSWORD_RULE_MESSAGE);
return;
}
this.loading = true;
updatePassword(
md5(this.passwordForm.oldPassword),