diff --git a/package.json b/package.json index c4edc23..cbf8ca3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ant-design-pro", - "version": "4.5.61", + "version": "4.5.62", "private": true, "description": "An out-of-box UI solution for enterprise applications", "scripts": { diff --git a/src/models/login.ts b/src/models/login.ts index aa18a10..da4fc6b 100644 --- a/src/models/login.ts +++ b/src/models/login.ts @@ -51,6 +51,9 @@ const Model: LoginModelType = { // 登录方法 * login({ payload }, { call, put }) { const response = yield call(accountLogin, payload); + + console.log('responseresponseresponseresponse', response); + yield put({ type: 'changeLoginStatus', payload: response, @@ -58,8 +61,16 @@ const Model: LoginModelType = { // Login successfully if (response.status === 'ok') { // yield put({ type: 'global/getMenuData', payload: response.currentUser.ID }); // 生成左侧菜单 - yield put({ type: 'user/saveCurrentUser', payload: { ...response.currentUser } }); // 存储用户信息 + // 这里拿一下用户信息 顺便判断一下 当前用户 是不是密码等级过低 + if (!response?.passwordRes) { + message.error('密码过于简单,请重新设置密码!') + history.push('/user/forgetPassword'); + + return + } + + yield put({ type: 'user/saveCurrentUser', payload: { ...response.currentUser } }); // 存储用户信息 message.success('🎉 🎉 🎉 登录成功!'); if (!history) return; diff --git a/src/pages/User/ForgetPassword/index.tsx b/src/pages/User/ForgetPassword/index.tsx index 5dd2ed4..51f3002 100644 --- a/src/pages/User/ForgetPassword/index.tsx +++ b/src/pages/User/ForgetPassword/index.tsx @@ -39,12 +39,12 @@ const handelResetPassWord = async (item: CloudChangePassword) => { const ForgetPasswordContent: React.FC = () => { const [submitting, setSubmitting] = useState() const newPasswordForm = useRef() - - const [step, setStep] = useState<1 | 2 >(1) // 1填写信息 2 修改成功 + + const [step, setStep] = useState<1 | 2>(1) // 1填写信息 2 修改成功 return (
- {step === 1 ? '驿商云忘记密码' : ''} - + {step === 1 ? '驿商云重置密码' : ''} + {step === 1 && { setSubmitting(true) const newValue = { ...values, DataType: 2000 } let success = null - - delete newValue.ComfirmPassword - - success = await handelResetPassWord( {...newValue } ) - setSubmitting(false) + + delete newValue.ComfirmPassword + + success = await handelResetPassWord({ ...newValue }) + setSubmitting(false) if (success) { - + setStep(2) - return true + return true } return false - + }} > - + { rules={[ { required: true, - message: '' + message: '请输入新密码' + }, + { + min: 8, + message: '密码长度至少8位' + }, + { + validator: (_, value) => { + if (!value) return Promise.resolve(); + + // 检查密码复杂度:数字、大小写字母、特殊字符中的2种以上组成 + const hasNumber = /\d/.test(value); + const hasLowercase = /[a-z]/.test(value); + const hasUppercase = /[A-Z]/.test(value); + const hasSpecialChar = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(value); + + const typeCount = [hasNumber, hasLowercase, hasUppercase, hasSpecialChar].filter(Boolean).length; + + if (typeCount < 2) { + return Promise.reject(new Error('密码不符合安全要求,请设置长度8位以上,由数字、大小写字母、特殊字符中的2种以上组成')); + } + + return Promise.resolve(); + } } ]} placeholder="" hasFeedback + extra={ + + 密码规则:长度8位以上,由数字、大小写字母、特殊字符中的2种以上组成 + + } /> { /> - + } {step === 2 && <> history.push('/user/login')}> 去登录}/> + extra={} /> + - } - - - + + +
); diff --git a/src/pages/reports/BusinessAnalysis/RevenueReport/index.tsx b/src/pages/reports/BusinessAnalysis/RevenueReport/index.tsx index ff06c41..743aaab 100644 --- a/src/pages/reports/BusinessAnalysis/RevenueReport/index.tsx +++ b/src/pages/reports/BusinessAnalysis/RevenueReport/index.tsx @@ -1,6 +1,5 @@ // 营收汇总报表 - import moment from 'moment'; import numeral from 'numeral'; import { connect, history } from 'umi'; @@ -35,6 +34,8 @@ import rectification from '@/assets/rectification.png' import codeIcon from '@/assets/DataVerification/code.png' import interfaceIcon from '@/assets/DataVerification/interface.png' import PageTitleBox from '@/components/PageTitleBox'; +import { formatTreeData, sortTreeData } from '@/utils/format'; +import { exportXlsxFromProColumnsExcelJS } from '@/utils/exportExcelFun'; const { Text } = Typography; @@ -82,6 +83,7 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => MERCHANTS_NAME: { show: false }, ShopTrade: { show: false }, }) + const SHOPTRADEObj = session.get('SHOPTRADEObj') // 显示每日流水抽屉 const [showDailyDrawer, setShowDailyDrawer] = useState(false) const [currentRow, setCurrentRow] = useState() @@ -384,11 +386,12 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => width: 120, valueType: 'select', hideInSearch: true, - request: async () => { - // 这里要手动添加枚举字段(从下面这些字典中选择一个):商品业态[BUSINESSTYPE] - const options = await getFieldEnum({ FieldExplainField: 'BUSINESSTYPE' }); - return options; - }, + valueEnum: SHOPTRADEObj + // request: async () => { + // // 这里要手动添加枚举字段(从下面这些字典中选择一个):商品业态[BUSINESSTYPE] + // const options = await getFieldEnum({ FieldExplainField: 'BUSINESSTYPE' }); + // return options; + // }, }, ] }, @@ -764,18 +767,22 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => span: 6, defaultCollapsed: false, }} - request={async (params) => { + request={async (params, sorter) => { + + const sortstr = Object.keys(sorter).map(n => { + const value = sorter[n] + return value ? `${n} ${value.replace('end', '')}` : '' + }) + console.log('sortstrsortstrsortstr', sortstr); + params.ServerpartIds = selectedId || '0' if (params?.StartDate === params?.EndDate) { setIsSameDay(true) } else { setIsSameDay(false) } - - const req: RevenueStatisticsParams = { ...params, - DataType: activeKey || '1', DataSourceType: DataSourceType || '1', ShowShop: params.ShowShop === '1', @@ -789,6 +796,11 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => const data = await getRevenueReport(req); setSearchParamsTime(params) setSearchTime([params.StartDate, params.EndDate]) + + let filterList: any = sortTreeData(data.data, sortstr.toString()) + console.log('filterList', filterList); + + setReqDetailList(data.data); setPrintOut(undefined); const list = data.data @@ -805,7 +817,6 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => isOneService = true } - let result: any = [] if (list && list.length > 0) { list.forEach((item: any, index: number) => { @@ -869,21 +880,30 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => } } - // if (list && list.length>0){ - // list.forEach((item: any)=>{ - // if (item.children && item.children.length>0){ - // // item.SPRegionType_Name = item.Serverpart_Name - // // item.Serverpart_Name = '' - // - // item.children.forEach((subItem: any)=>{ - // subItem.SPRegionType_Name = subItem.Serverpart_Name - // subItem.Serverpart_Name = '' - // }) - // } - // }) - // } + let fieldData: any = [ + 'TotalRevenue.Revenue_Amount', + 'TotalRevenue.MobilePay_Amount', + 'TotalRevenue.CashPay_Amount', + 'TotalRevenue.Mobile_Correct', + 'TotalRevenue.Cash_Correct', + 'RegionARevenue.Revenue_Amount', + 'RegionARevenue.MobilePay_Amount', + 'RegionARevenue.CashPay_Amount', + 'RegionARevenue.Mobile_Correct', + 'RegionARevenue.Cash_Correct', + 'RegionBRevenue.Revenue_Amount', + 'RegionBRevenue.MobilePay_Amount', + 'RegionBRevenue.CashPay_Amount', + 'RegionBRevenue.Mobile_Correct', + 'RegionBRevenue.Cash_Correct', + ] + let enumList: any = ['ShopTrade'] - setReqDetailList(result); + // 处理一下导出数据 + let newPrintData: any = formatTreeData(result, fieldData, enumList, SHOPTRADEObj, []) + console.log('newPrintDatanewPrintDatanewPrintData', newPrintData); + + setReqDetailList(newPrintData); if (result) { return { data: result, success: true }; } @@ -926,15 +946,15 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) => headerTitle={} toolbar={{ actions: [ - - - , + // + // + // , (