Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
xiaocp2009 2025-09-02 14:13:55 +08:00
commit 44dafe6068
22 changed files with 257 additions and 82 deletions

View File

@ -49,3 +49,11 @@ export function fetchGetDeptSelect() {
method: 'get' method: 'get'
}); });
} }
/** 获取部门选择框列表 */
export function fetchGetDeptBranchIdSelect() {
return request<Api.System.Dept[]>({
url: '/system/dept/optionselectBranchId',
method: 'get'
});
}

View File

@ -47,8 +47,6 @@ declare module "@elegant-router/types" {
"original": "/original"; "original": "/original";
"original_batch-account-info": "/original/batch-account-info"; "original_batch-account-info": "/original/batch-account-info";
"original_batch-bank-card-info": "/original/batch-bank-card-info"; "original_batch-bank-card-info": "/original/batch-bank-card-info";
"original_batch-account-info": "/original/batch-account-info";
"original_batch-bank-card-info": "/original/batch-bank-card-info";
"original_dianfei": "/original/dianfei"; "original_dianfei": "/original/dianfei";
"original_e-m-banking": "/original/e-m-banking"; "original_e-m-banking": "/original/e-m-banking";
"original_gjj-payment": "/original/gjj-payment"; "original_gjj-payment": "/original/gjj-payment";
@ -218,9 +216,6 @@ declare module "@elegant-router/types" {
| "system_client" | "system_client"
| "system_config" | "system_config"
| "system_dept-transfer" | "system_dept-transfer"
| "report"
| "original_batch-account-info"
| "original_batch-bank-card-info"
| "system_dept" | "system_dept"
| "system_dict" | "system_dict"
| "system_menu" | "system_menu"
@ -308,7 +303,7 @@ declare module "@elegant-router/types" {
component: `view.${K}`; component: `view.${K}`;
} }
: never; : never;
/** /**
* the center level route * the center level route
*/ */
@ -331,7 +326,7 @@ declare module "@elegant-router/types" {
children: (CenterLevelRoute<GetChildRouteKey<K>> | LastLevelRoute<GetChildRouteKey<K>>)[]; children: (CenterLevelRoute<GetChildRouteKey<K>> | LastLevelRoute<GetChildRouteKey<K>>)[];
} }
: never; : never;
/** /**
* the custom first level route * the custom first level route
*/ */

View File

@ -1,8 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, reactive, watch } from 'vue'; import {computed, onMounted, reactive, ref, watch} from 'vue';
import { fetchCreatePercentage, fetchUpdatePercentage } from '@/service/api/business/percentage'; import { fetchCreatePercentage, fetchUpdatePercentage } from '@/service/api/business/percentage';
import { useFormRules, useNaiveForm } from '@/hooks/common/form'; import { useFormRules, useNaiveForm } from '@/hooks/common/form';
import { $t } from '@/locales'; import { $t } from '@/locales';
import {fetchGetDeptBranchIdSelect} from "@/service/api/system";
defineOptions({ defineOptions({
name: 'PercentageOperateDrawer' name: 'PercentageOperateDrawer'
@ -142,19 +143,47 @@ const displayJbPercent = computed({
set: (val) => { set: (val) => {
model.jbPercent = val ? val / 100 : 0 model.jbPercent = val ? val / 100 : 0
} }
}) });
onMounted(() => {
getDeptIdOptions()
});
const deptIdOptions = ref<CommonType.Option<CommonType.IdType>[]>([]);
//
async function getDeptIdOptions(){
const { error, data } = await fetchGetDeptBranchIdSelect();
if (!error) {
deptIdOptions.value = data.map(item => ({
label: item.deptName,
value: item.deptCategory
}));
}
}
function handleDeptUpdate(value: string, option: CommonType.Option<CommonType.IdType>) {
model.branchId = value;
model.branchName = option.label;
}
</script> </script>
<template> <template>
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%"> <NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
<NDrawerContent :title="title" :native-scrollbar="false" closable> <NDrawerContent :title="title" :native-scrollbar="false" closable>
<NForm ref="formRef" :model="model" :rules="rules"> <NForm ref="formRef" :model="model" :rules="rules">
<NFormItem label="支行代码" path="branchId">
<NInput v-model:value="model.branchId" placeholder="请输入支行代码" />
</NFormItem>
<NFormItem label="支行名称" path="branchName"> <NFormItem label="支行名称" path="branchName">
<NInput v-model:value="model.branchName" placeholder="请输入支行名称" /> <!-- <NInput v-model:value="model.branchName" placeholder="请输入支行名称" />-->
<NSelect
v-model:value="model.branchName"
filterable
placeholder="选择支行"
:options="deptIdOptions"
clearable
@update:value="handleDeptUpdate"
/>
</NFormItem> </NFormItem>
<NFormItem label="支行代码" path="branchId">
<NInput v-model:value="model.branchId" disabled placeholder="请输入支行代码" />
</NFormItem>
<NFormItem label="营销人员分成比例" path="yxPercent"> <NFormItem label="营销人员分成比例" path="yxPercent">
<!-- <NInput v-model:value="model.yxPercent" placeholder="请输入营销人员分成比例" />--> <!-- <NInput v-model:value="model.yxPercent" placeholder="请输入营销人员分成比例" />-->
<NInput-number <NInput-number

View File

@ -1,7 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import {onMounted, ref} from 'vue';
import { useNaiveForm } from '@/hooks/common/form'; import { useNaiveForm } from '@/hooks/common/form';
import { $t } from '@/locales'; import { $t } from '@/locales';
import {fetchGetDeptBranchIdSelect} from "@/service/api/system";
defineOptions({ defineOptions({
name: 'PercentageSearch' name: 'PercentageSearch'
@ -30,6 +31,26 @@ async function search() {
await validate(); await validate();
emit('search'); emit('search');
} }
onMounted(() => {
getDeptIdOptions()
});
const deptIdOptions = ref<CommonType.Option<CommonType.IdType>[]>([]);
//
async function getDeptIdOptions(){
const { error, data } = await fetchGetDeptBranchIdSelect();
if (!error) {
deptIdOptions.value = data.map(item => ({
label: item.deptName,
value: item.deptCategory
}));
}
}
function handleDeptUpdate(value: string, option: CommonType.Option<CommonType.IdType>) {
model.value.branchId = value;
// model.value.branchName = option.label;
}
</script> </script>
<template> <template>
@ -38,18 +59,28 @@ async function search() {
<NCollapseItem :title="$t('common.search')" name="user-search"> <NCollapseItem :title="$t('common.search')" name="user-search">
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> <NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
<NGrid responsive="screen" item-responsive> <NGrid responsive="screen" item-responsive>
<NFormItemGi span="24 s:12 m:6" label="支行名称" path="branchName" class="pr-24px">
<!-- <NInput v-model:value="model.branchName" placeholder="请输入支行名称" />-->
<NSelect
v-model:value="model.branchName"
filterable
placeholder="选择支行"
:options="deptIdOptions"
clearable
@update:value="handleDeptUpdate"
/>
</NFormItemGi>
<NFormItemGi span="24 s:12 m:6" label="支行代码" path="branchId" class="pr-24px"> <NFormItemGi span="24 s:12 m:6" label="支行代码" path="branchId" class="pr-24px">
<NInput v-model:value="model.branchId" placeholder="请输入支行代码" /> <NInput v-model:value="model.branchId" placeholder="请输入支行代码" />
</NFormItemGi> </NFormItemGi>
<NFormItemGi span="24 s:12 m:6" label="支行名称" path="branchName" class="pr-24px">
<NInput v-model:value="model.branchName" placeholder="请输入支行名称" /> <!-- <NFormItemGi span="24 s:12 m:6" label="营销人员分成比例" path="yxPercent" class="pr-24px">-->
</NFormItemGi> <!-- <NInput v-model:value="model.yxPercent" placeholder="请输入营销人员分成比例" />-->
<NFormItemGi span="24 s:12 m:6" label="营销人员分成比例" path="yxPercent" class="pr-24px"> <!-- </NFormItemGi>-->
<NInput v-model:value="model.yxPercent" placeholder="请输入营销人员分成比例" /> <!-- <NFormItemGi span="24 s:12 m:6" label="经办人员分成比例" path="jbPercent" class="pr-24px">-->
</NFormItemGi> <!-- <NInput v-model:value="model.jbPercent" placeholder="请输入经办人员分成比例" />-->
<NFormItemGi span="24 s:12 m:6" label="经办人员分成比例" path="jbPercent" class="pr-24px"> <!-- </NFormItemGi>-->
<NInput v-model:value="model.jbPercent" placeholder="请输入经办人员分成比例" />
</NFormItemGi>
<NFormItemGi span="24" class="pr-24px"> <NFormItemGi span="24" class="pr-24px">
<NSpace class="w-full" justify="end"> <NSpace class="w-full" justify="end">
<NButton @click="reset"> <NButton @click="reset">

View File

@ -81,9 +81,9 @@ async function search() {
<!-- <NFormItemGi span="24 s:12 m:6" label="营销人员营销号" path="yxId" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="营销人员营销号" path="yxId" class="pr-24px">-->
<!-- <NInput v-model:value="model.yxId" placeholder="请输入营销人员营销号" />--> <!-- <NInput v-model:value="model.yxId" placeholder="请输入营销人员营销号" />-->
<!-- </NFormItemGi>--> <!-- </NFormItemGi>-->
<!-- <NFormItemGi span="24 s:12 m:6" label="经办人员营销号" path="jbId" class="pr-24px">--> <NFormItemGi span="24 s:12 m:6" label="营销号" path="jbId" class="pr-24px">
<!-- <NInput v-model:value="model.jbId" placeholder="请输入经办人员营销号" />--> <NInput v-model:value="model.jbId" placeholder="请输入经办人员营销号" />
<!-- </NFormItemGi>--> </NFormItemGi>
<!-- <NFormItemGi span="24 s:12 m:6" label="数据日期" path="date" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="数据日期" path="date" class="pr-24px">-->
<!-- <NDatePicker--> <!-- <NDatePicker-->
<!-- v-model:formatted-value="model.date"--> <!-- v-model:formatted-value="model.date"-->

View File

@ -52,7 +52,7 @@ function createDefaultModel(): Model {
employeeName: '', employeeName: '',
marketingCode: '', marketingCode: '',
addItem: 0, addItem: 0,
recordMonth: dayjs().subtract(1, 'month').startOf('month').valueOf() , recordMonth: dayjs().subtract(1, 'month').startOf('month').format('YYYY-MM')
}; };
} }
@ -222,9 +222,9 @@ function disablePreviousDate(ts: number) {
<NFormItem label="附加项" path="addItem"> <NFormItem label="附加项" path="addItem">
<NInput-number <NInput-number
v-model:value="model.addItem" :value="Number(model.addItem)"
@update:value="newVal => model.addItem = newVal"
:precision="0" :precision="2"
step="1" step="1"
placeholder="请输入附加项" placeholder="请输入附加项"
/> />
@ -232,8 +232,9 @@ function disablePreviousDate(ts: number) {
<NFormItem label="记录月份" path="recordMonth"> <NFormItem label="记录月份" path="recordMonth">
<!-- <NInput v-model:value="model.recordMonth" placeholder="请输入记录月份" />--> <!-- <NInput v-model:value="model.recordMonth" placeholder="请输入记录月份" />-->
<NDatePicker <NDatePicker
v-model:value="model.recordMonth" v-model:formatted-value="model.recordMonth"
type="month" type="month"
:value-format="'yyyy-MM'"
placeholder="请输入选择月份" placeholder="请输入选择月份"
:is-date-disabled="disablePreviousDate" :is-date-disabled="disablePreviousDate"
/> />

View File

@ -237,7 +237,7 @@ const {
); );
} }
// magneticCardIdmagneticCardListmagneticCardId // magneticCardIdmagneticCardListmagneticCardId
return row.magneticCardId || ''; return '';
} }
}, },
{ {
@ -293,7 +293,7 @@ const {
); );
} }
// trafficIdtrafficListtrafficId // trafficIdtrafficListtrafficId
return row.trafficId || ''; return '';
} }
}, },
{ {
@ -484,9 +484,9 @@ function edit(dataId: CommonType.IdType) {
handleEdit('dataId', dataId); handleEdit('dataId', dataId);
} }
function handleImport() { // function handleImport() {
openImportModal(); // openImportModal();
} // }
function handleExport() { function handleExport() {
download('/mps/market/export', searchParams, `营销数据管理_${new Date().getTime()}.xlsx`); download('/mps/market/export', searchParams, `营销数据管理_${new Date().getTime()}.xlsx`);
@ -525,20 +525,20 @@ async function getSubcategoryOptions() {
:loading="loading" :loading="loading"
:show-add="hasAuth('mps:market:add')" :show-add="hasAuth('mps:market:add')"
:show-delete="hasAuth('mps:market:remove')" :show-delete="hasAuth('mps:market:remove')"
:show-export="hasAuth('mps:market:export')" :show-export="false"
@add="handleAdd" @add="handleAdd"
@delete="handleBatchDelete" @delete="handleBatchDelete"
@export="handleExport" @export="handleExport"
@refresh="getData" @refresh="getData"
> >
<template #after> <!-- <template #after>-->
<NButton v-if="hasAuth('mps:market:export')" size="small" ghost @click="handleImport"> <!-- <NButton v-if="hasAuth('mps:market:export')" size="small" ghost @click="handleImport">-->
<template #icon> <!-- <template #icon>-->
<SvgIcon local-icon="upload-rounded" class="text-icon"/> <!-- <SvgIcon local-icon="upload-rounded" class="text-icon"/>-->
</template> <!-- </template>-->
{{ $t('common.import') }} <!-- {{ $t('common.import') }}-->
</NButton> <!-- </NButton>-->
</template> <!-- </template>-->
</TableHeaderOperation> </TableHeaderOperation>
</template> </template>

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, onMounted, reactive, ref, watch } from 'vue'; import { computed,defineComponent, onMounted, reactive, ref, watch } from 'vue';
import { fetchCreateMarket, fetchUpdateMarket } from '@/service/api/mps/market'; import { fetchCreateMarket, fetchUpdateMarket } from '@/service/api/mps/market';
import { fetchGetMuUserSelect } from '@/service/api/system'; import { fetchGetMuUserSelect } from '@/service/api/system';
import { useAuthStore } from '@/store/modules/auth'; import { useAuthStore } from '@/store/modules/auth';
@ -8,10 +8,13 @@ import { useDict } from '@/hooks/business/dict';
import { $t } from '@/locales'; import { $t } from '@/locales';
import { useLoading } from '~/packages/hooks'; import { useLoading } from '~/packages/hooks';
defineOptions({ defineOptions({
name: 'MarketOperateDrawer' name: 'MarketOperateDrawer'
}); });
interface Props { interface Props {
/** the type of operation */ /** the type of operation */
operateType: NaiveUI.TableOperateType; operateType: NaiveUI.TableOperateType;
@ -136,6 +139,13 @@ const acquiringIdPatternRule = {
trigger: 'change' trigger: 'change'
}; };
//
const onlyAllowCharNumber= (value: string) => !value || /^[a-zA-Z0-9]+$/.test(value);
//
const onlyAllowNumber= (value: string) => !value || /^\d+$/.test(value);
const noSideSpace= (value: string) => !value.startsWith(' ') && !value.endsWith(' ');
// const custTypeRule = computed(() => { // const custTypeRule = computed(() => {
// // "" // // ""
// if (model.subcategoryName !== '') { // if (model.subcategoryName !== '') {
@ -754,19 +764,19 @@ watch(
<tbody> <tbody>
<tr v-for="(item, index) in model.magneticCardList" :key="index"> <tr v-for="(item, index) in model.magneticCardList" :key="index">
<td> <td>
<NInputNumber <NInput
v-model:value="item.oldCardNo" v-model:value="item.oldCardNo"
placeholder="请输入老卡号" placeholder="请输入老卡号"
:show-button="false" :allow-input = "onlyAllowNumber"
:controls="false" style="width: 100%" style="width: 100%"
/> />
</td> </td>
<td> <td>
<NInputNumber <NInput
v-model:value="item.newCardNo" v-model:value="item.newCardNo"
placeholder="请输入新卡号" placeholder="请输入新卡号"
:show-button="false" :allow-input = "onlyAllowNumber"
:controls="false" style="width: 100%" style="width: 100%"
/> />
</td> </td>
<td> <td>
@ -782,7 +792,7 @@ watch(
</NTable> </NTable>
</NFormItem> </NFormItem>
<NFormItem v-if="isdisplayacquiringName" label="综合收单商户名" path="acquiringName"> <NFormItem v-if="isdisplayacquiringName" label="综合收单商户名" path="acquiringName">
<NInput v-model:value="model.acquiringName" placeholder="请输入综合收单商户名" /> <NInput v-model:value="model.acquiringName" :allow-input="noSideSpace" placeholder="请输入综合收单商户名" />
</NFormItem> </NFormItem>
<NFormItem v-if="isdisplayacquiringId" label="综合收单商户号" path="acquiringId"> <NFormItem v-if="isdisplayacquiringId" label="综合收单商户号" path="acquiringId">
<NInput v-model:value="model.acquiringId" placeholder="请输入综合收单商户号" /> <NInput v-model:value="model.acquiringId" placeholder="请输入综合收单商户号" />
@ -812,16 +822,26 @@ watch(
<tbody> <tbody>
<tr v-for="(item, index) in model.trafficList || []" :key="index"> <tr v-for="(item, index) in model.trafficList || []" :key="index">
<td> <td>
<NInputNumber <NInput
v-model:value="item.trafficNo" v-model:value="item.trafficNo"
placeholder="请输入决定书编号" placeholder="请输入决定书编号"
:show-button="false" :allow-input = "onlyAllowCharNumber"
:controls="false"
style="width: 100%" style="width: 100%"
/> />
</td> </td>
<td> <td>
<NInputNumber v-model:value="item.trafficAmt" placeholder="请输入处罚金额" :min="0" style="width: 100%" /> <NInputNumber
v-model:value="item.trafficAmt"
placeholder="请输入处罚金额"
:min="0"
:precision="2"
:show-button="false"
style="width: 100%"
>
<template #suffix>
</template>
</NInputNumber>
</td> </td>
<td> <td>
<NButton text type="error" @click="removeTrafficItem(index)">删除</NButton> <NButton text type="error" @click="removeTrafficItem(index)">删除</NButton>
@ -836,10 +856,10 @@ watch(
</NTable> </NTable>
</NFormItem> </NFormItem>
<NFormItem v-if="isdisplayworkplace" label="职工所属单位" path="workplace"> <NFormItem v-if="isdisplayworkplace" label="职工所属单位" path="workplace">
<NInput v-model:value="model.workplace" placeholder="请输入职工所属单位" /> <NInput v-model:value="model.workplace" :allow-input="noSideSpace" placeholder="请输入职工所属单位" />
</NFormItem> </NFormItem>
<NFormItem v-if="isdisplaysurplusAccountName" label="公积金缴纳账户名称" path="surplusAccountName"> <NFormItem v-if="isdisplaysurplusAccountName" label="公积金缴纳账户名称" path="surplusAccountName">
<NInput v-model:value="model.surplusAccountName" placeholder="请输入公积金缴纳账户名称" /> <NInput v-model:value="model.surplusAccountName" :allow-input="noSideSpace" placeholder="请输入公积金缴纳账户名称" />
</NFormItem> </NFormItem>
<NFormItem v-if="isdisplayheatingNo" label="户号" path="heatingNo"> <NFormItem v-if="isdisplayheatingNo" label="户号" path="heatingNo">
<NInput v-model:value="model.heatingNo" placeholder="请输入户号" /> <NInput v-model:value="model.heatingNo" placeholder="请输入户号" />

View File

@ -17,6 +17,9 @@ const props = withDefaults(defineProps<Props>(), {
subcategoryIdOptions: () => [] subcategoryIdOptions: () => []
}); });
const { options: mps_cust_type } = useDict('mps_cust_type');
interface Emits { interface Emits {
(e: 'reset'): void; (e: 'reset'): void;
(e: 'search'): void; (e: 'search'): void;
@ -49,7 +52,7 @@ async function search() {
<NCollapseItem :title="$t('common.search')" name="user-search"> <NCollapseItem :title="$t('common.search')" name="user-search">
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> <NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
<NGrid responsive="screen" item-responsive> <NGrid responsive="screen" item-responsive>
<NFormItemGi span="24 s:12 m:8" label="业务类型" path="subcategoryName" class="pr-24px"> <NFormItemGi span="24" label="业务类型" path="subcategoryName" class="pr-24px">
<NSelect <NSelect
v-model:value="model.subcategoryId" v-model:value="model.subcategoryId"
filterable filterable
@ -83,20 +86,20 @@ async function search() {
<!-- <NFormItemGi span="24 s:12 m:6" label="部门id" path="deptId" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="部门id" path="deptId" class="pr-24px">-->
<!-- <NInput v-model:value="model.deptId" placeholder="请输入部门id" />--> <!-- <NInput v-model:value="model.deptId" placeholder="请输入部门id" />-->
<!-- </NFormItemGi>--> <!-- </NFormItemGi>-->
<!-- <NFormItemGi span="24 s:12 m:6" label="客户类型1-个人2-对公)" path="custType" class="pr-24px">--> <NFormItemGi span="24 s:12 m:6" label="客户类型" path="custType" class="pr-24px">
<!-- <NSelect--> <NSelect
<!-- v-model:value="model.custType"--> v-model:value="model.custType"
<!-- placeholder="请选择客户类型1-个人2-对公)"--> placeholder="请选择客户类型1-个人2-对公)"
<!-- :options="[]"--> :options="mps_cust_type"
<!-- clearable--> clearable
<!-- />--> />
<!-- </NFormItemGi>--> </NFormItemGi>
<!-- <NFormItemGi span="24 s:12 m:6" label="客户身份证号" path="custId" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="客户身份证号" path="custId" class="pr-24px">-->
<!-- <NInput v-model:value="model.custId" placeholder="请输入客户身份证号" />--> <!-- <NInput v-model:value="model.custId" placeholder="请输入客户身份证号" />-->
<!-- </NFormItemGi>--> <!-- </NFormItemGi>-->
<!-- <NFormItemGi span="24 s:12 m:6" label="客户姓名" path="custName" class="pr-24px">--> <NFormItemGi span="24 s:12 m:6" label="客户姓名" path="custName" class="pr-24px">
<!-- <NInput v-model:value="model.custName" placeholder="请输入客户姓名" />--> <NInput v-model:value="model.custName" placeholder="请输入客户姓名" />
<!-- </NFormItemGi>--> </NFormItemGi>
<!-- <NFormItemGi span="24 s:12 m:6" label="客户账号/卡号" path="custAcctNo" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="客户账号/卡号" path="custAcctNo" class="pr-24px">-->
<!-- <NInput v-model:value="model.custAcctNo" placeholder="请输入客户账号/卡号" />--> <!-- <NInput v-model:value="model.custAcctNo" placeholder="请输入客户账号/卡号" />-->
<!-- </NFormItemGi>--> <!-- </NFormItemGi>-->
@ -127,7 +130,7 @@ async function search() {
<!-- <NFormItemGi span="24 s:12 m:6" label="取暖费户号" path="heatingNo" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="取暖费户号" path="heatingNo" class="pr-24px">-->
<!-- <NInput v-model:value="model.heatingNo" placeholder="请输入取暖费户号" />--> <!-- <NInput v-model:value="model.heatingNo" placeholder="请输入取暖费户号" />-->
<!-- </NFormItemGi>--> <!-- </NFormItemGi>-->
<NFormItemGi span="24 s:12 m:8" label="核对标志" path="checkFlag" class="pr-24px"> <NFormItemGi span="24 s:12 m:6" label="核对标志" path="checkFlag" class="pr-24px">
<NSelect v-model:value="model.checkFlag" :options="mpsCheckStatusOptions" placeholder="请选择核对状态" /> <NSelect v-model:value="model.checkFlag" :options="mpsCheckStatusOptions" placeholder="请选择核对状态" />
</NFormItemGi> </NFormItemGi>
<!-- <NFormItemGi span="24 s:12 m:6" label="核对时间" path="checkTime" class="pr-24px">--> <!-- <NFormItemGi span="24 s:12 m:6" label="核对时间" path="checkTime" class="pr-24px">-->

View File

@ -2,6 +2,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { h, ref, watch } from 'vue'; import { h, ref, watch } from 'vue';
import type { UploadFileInfo } from 'naive-ui'; import type { UploadFileInfo } from 'naive-ui';
import dayjs from "dayjs";
import { getToken } from '@/store/modules/auth/shared'; import { getToken } from '@/store/modules/auth/shared';
import { useDownload } from '@/hooks/business/download'; import { useDownload } from '@/hooks/business/download';
import { getServiceBaseURL } from '@/utils/service'; import { getServiceBaseURL } from '@/utils/service';
@ -36,7 +37,8 @@
}); });
const data = ref<Record<string, any>>({ const data = ref<Record<string, any>>({
updateSupport: false updateSupport: false,
importMonth: dayjs().subtract(1, 'month').startOf('month').valueOf()
}); });
const fileList = ref<UploadFileInfo[]>([]); const fileList = ref<UploadFileInfo[]>([]);
@ -98,6 +100,16 @@
message.value = ''; message.value = '';
} }
} ); } );
function disablePreviousDate(ts: number) {
//
const currentMonthStart = new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime()
const prevMonthStart = new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1).getTime()
return ts !== currentMonthStart && ts !== prevMonthStart
// const prevMonthStart = dayjs().subtract(1, 'month').startOf('month')
// // 1
// return ts < prevMonthStart.valueOf()
}
</script> </script>
]]] ]]]
@ -143,7 +155,15 @@
</NUploadDragger> </NUploadDragger>
</NUpload> </NUpload>
<div class="flex-center"> <div class="flex-center">
<NCheckbox v-model="data.updateSupport">{{ $t('common.updateExisting') }}</NCheckbox> <!-- <NCheckbox v-model="data.updateSupport">{{ $t('common.updateExisting') }}</NCheckbox>-->
<!-- <n-divider vertical />-->
<NDatePicker
v-model:value="data.importMonth"
type="month"
:placeholder="$t('common.selectImportMonth')"
:is-date-disabled="disablePreviousDate"
disabled
/>
</div> </div>
<NAlert v-if="message" :title="$t('common.importResult')" :type="success ? 'success' : 'error'" :bordered="false"> <NAlert v-if="message" :title="$t('common.importResult')" :type="success ? 'success' : 'error'" :bordered="false">
<template #default> <template #default>
@ -152,7 +172,7 @@
</NAlert> </NAlert>
<template #footer> <template #footer>
<NSpace justify="end" :size="16"> <NSpace justify="end" :size="16">
<NButton @click="handleDownloadTemplate">{{ $t('common.downloadTemplate') }}</NButton> <!-- <NButton @click="handleDownloadTemplate">{{ $t('common.downloadTemplate') }}</NButton>-->
<NButton type="primary" @click="handleSubmit">{{ $t('common.import') }}</NButton> <NButton type="primary" @click="handleSubmit">{{ $t('common.import') }}</NButton>
</NSpace> </NSpace>
</template> </template>

View File

@ -115,7 +115,7 @@ function createDefaultModel(): Model {
fixedTermWealthAmount: undefined, fixedTermWealthAmount: undefined,
newHousingFundCustomerCount: undefined, newHousingFundCustomerCount: undefined,
newHousingFundCustomerAmount: undefined, newHousingFundCustomerAmount: undefined,
addItem: undefined, addItem: 0.00,
totalCount: undefined, totalCount: undefined,
totalAmount: undefined, totalAmount: undefined,
recordDate: undefined, recordDate: undefined,
@ -581,7 +581,7 @@ watch(visible, () => {
<NInput v-model:value="model.newHousingFundCustomerAmount" placeholder="请输入新营销公积金缴存客户奖励金额" /> <NInput v-model:value="model.newHousingFundCustomerAmount" placeholder="请输入新营销公积金缴存客户奖励金额" />
</NFormItem> </NFormItem>
<NFormItem label="附加项" path="addItem"> <NFormItem label="附加项" path="addItem">
<NInput-number v-model:value="model.addItem" placeholder="请输入附加项" /> <NInput-number v-model:value="model.addItem" placeholder="请输入附加项" disabled />
</NFormItem> </NFormItem>
<NFormItem label="有效个数总计" path="totalCount"> <NFormItem label="有效个数总计" path="totalCount">
<NInput-number :min="0" v-model:value="model.totalCount" placeholder="请输入有效个数总计" /> <NInput-number :min="0" v-model:value="model.totalCount" placeholder="请输入有效个数总计" />

View File

@ -168,7 +168,7 @@ public class BusinessSubcategoryServiceImpl implements IBusinessSubcategoryServi
return baseMapper.selectSubcategoryList(new LambdaQueryWrapper<BusinessSubcategory>() return baseMapper.selectSubcategoryList(new LambdaQueryWrapper<BusinessSubcategory>()
//.select(SysUser::getUserId, SysUser::getMktNo, SysUser::getNickName) //.select(SysUser::getUserId, SysUser::getMktNo, SysUser::getNickName)
.select(BusinessSubcategory::getId, BusinessSubcategory::getName) .select(BusinessSubcategory::getId, BusinessSubcategory::getName)
.ne( BusinessSubcategory::getTypeId, "BIZ006")//BIZ006 新增综合收单商户留存率提升当季不录入 // .ne( BusinessSubcategory::getTypeId, "BIZ006")//BIZ006 新增综合收单商户留存率提升当季不录入
.eq(BusinessSubcategory::getStatus, "0")); .eq(BusinessSubcategory::getStatus, "0"));
} }

View File

@ -180,6 +180,11 @@ public class MpsMarket extends TenantEntity {
*/ */
private String checkMsg; private String checkMsg;
/**
* 创建时间
*/
private String entryDate;
/** /**
* 删除标志0代表存在 1代表删除 * 删除标志0代表存在 1代表删除
*/ */

View File

@ -3,6 +3,7 @@ package org.dromara.mps.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.idev.excel.util.DateUtils;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
@ -178,6 +179,7 @@ public class MpsMarketServiceImpl implements IMpsMarketService {
// } // }
// MpsMarket add = mpsMarketConverter.convert(bo); // MpsMarket add = mpsMarketConverter.convert(bo);
MpsMarket add = MapstructUtils.convert(bo, MpsMarket.class); MpsMarket add = MapstructUtils.convert(bo, MpsMarket.class);
add.setEntryDate(DateUtils.format(new Date(), "yyyy_MM_dd"));
validEntityBeforeAdd(add); validEntityBeforeAdd(add);
System.out.println("add:--->"+add); System.out.println("add:--->"+add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;

View File

@ -1,5 +1,6 @@
package org.dromara.original.controller; package org.dromara.original.controller;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
@ -7,6 +8,9 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.enums.FormatsType;
import org.dromara.common.core.utils.DateUtils;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.dromara.common.excel.core.ExcelResult; import org.dromara.common.excel.core.ExcelResult;
@ -79,8 +83,11 @@ public class OriginalBatchAccountInfoController extends BaseController {
@Log(title = "批量账户信息查询(对公)", businessType = BusinessType.IMPORT) @Log(title = "批量账户信息查询(对公)", businessType = BusinessType.IMPORT)
@SaCheckPermission("original:batchAccountInfo:import") @SaCheckPermission("original:batchAccountInfo:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport,
ExcelResult<OriginalBatchAccountInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), OriginalBatchAccountInfoImportVo.class, new OriginalBatchAccountInfoImportListener(updateSupport)); @RequestParam @DateTimeFormat(pattern = "yyyy-MM") Date importMonth) throws Exception {
String importTime = DateUtils.parseDateToStr(FormatsType.YYYY_MM,importMonth);
originalBatchAccountInfoService.deleteDataByMonth(importTime);
ExcelResult<OriginalBatchAccountInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), OriginalBatchAccountInfoImportVo.class, new OriginalBatchAccountInfoImportListener(updateSupport,importTime));
return R.ok(result.getAnalysis()); return R.ok(result.getAnalysis());
} }

View File

@ -38,6 +38,7 @@ public class OriginalBatchAccountInfoImportListener extends AnalysisEventListene
private final Boolean isUpdateSupport; private final Boolean isUpdateSupport;
private final Long operUserId; private final Long operUserId;
private int countN = 1; private int countN = 1;
private final String importTime;
// 存储所有解析成功的对象 // 存储所有解析成功的对象
private final Collection<OriginalBatchAccountInfo> successList = new ArrayList<>(); private final Collection<OriginalBatchAccountInfo> successList = new ArrayList<>();
@ -47,10 +48,11 @@ public class OriginalBatchAccountInfoImportListener extends AnalysisEventListene
//private final Collection<Pair<OriginalBatchAccountInfoImportVo, String>> failureList = new ArrayList<>(); //private final Collection<Pair<OriginalBatchAccountInfoImportVo, String>> failureList = new ArrayList<>();
private final Collection<Pair<Integer, String>> failureList = new ArrayList<>(); private final Collection<Pair<Integer, String>> failureList = new ArrayList<>();
public OriginalBatchAccountInfoImportListener(Boolean isUpdateSupport) { public OriginalBatchAccountInfoImportListener(Boolean isUpdateSupport, String importTime) {
this.originalBatchAccountInfoService = SpringUtils.getBean(IOriginalBatchAccountInfoService.class); this.originalBatchAccountInfoService = SpringUtils.getBean(IOriginalBatchAccountInfoService.class);
this.isUpdateSupport = isUpdateSupport; this.isUpdateSupport = isUpdateSupport;
this.operUserId = LoginHelper.getUserId(); this.operUserId = LoginHelper.getUserId();
this.importTime = importTime;
} }
@Override @Override
@ -66,7 +68,7 @@ public class OriginalBatchAccountInfoImportListener extends AnalysisEventListene
// 2. 转换为业务对象 // 2. 转换为业务对象
OriginalBatchAccountInfo originalBatchAccountInfo = BeanUtil.toBean(originalBatchAccountInfoImportVo, OriginalBatchAccountInfo.class); OriginalBatchAccountInfo originalBatchAccountInfo = BeanUtil.toBean(originalBatchAccountInfoImportVo, OriginalBatchAccountInfo.class);
originalBatchAccountInfo.setImportTime(importTime);
// 3. 添加到成功列表稍后批量处理 // 3. 添加到成功列表稍后批量处理
successList.add(originalBatchAccountInfo); successList.add(originalBatchAccountInfo);

View File

@ -72,4 +72,6 @@ public interface IOriginalBatchAccountInfoService {
* @return 是否删除成功 * @return 是否删除成功
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean deleteDataByMonth(String importTime);
} }

View File

@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.original.domain.OriginalTraffic;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.original.domain.bo.OriginalBatchAccountInfoBo; import org.dromara.original.domain.bo.OriginalBatchAccountInfoBo;
import org.dromara.original.domain.vo.OriginalBatchAccountInfoVo; import org.dromara.original.domain.vo.OriginalBatchAccountInfoVo;
@ -194,4 +195,9 @@ public class OriginalBatchAccountInfoServiceImpl implements IOriginalBatchAccoun
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
@Override
public Boolean deleteDataByMonth(String importTime) {
return baseMapper.delete(new LambdaQueryWrapper<OriginalBatchAccountInfo>().eq(OriginalBatchAccountInfo::getImportTime, importTime))>0;
}
} }

View File

@ -140,4 +140,15 @@ public class SysDeptController extends BaseController {
return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds))); return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds)));
} }
/**
* 获取部门选择框列表
*
* @param deptIds 部门ID串
*/
@SaCheckPermission("system:dept:query")
@GetMapping("/optionselectBranchId")
public R<List<SysDeptVo>> optionselectBranchId(@RequestParam(required = false) Long[] deptIds) {
return R.ok(deptService.selectDeptCatByIds(deptIds == null ? null : List.of(deptIds)));
}
} }

View File

@ -74,6 +74,13 @@ public interface ISysDeptService {
*/ */
List<SysDeptVo> selectDeptByIds(List<Long> deptIds); List<SysDeptVo> selectDeptByIds(List<Long> deptIds);
/**
* 通过部门id查网点号
* @param deptIds
* @return
*/
List<SysDeptVo> selectDeptCatByIds(List<Long> deptIds);
/** /**
* 根据ID查询所有子部门数正常状态 * 根据ID查询所有子部门数正常状态
* *

View File

@ -193,6 +193,14 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
.in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds)); .in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds));
} }
@Override
public List<SysDeptVo> selectDeptCatByIds(List<Long> deptIds) {
return baseMapper.selectDeptList(new LambdaQueryWrapper<SysDept>()
.select(SysDept::getDeptCategory, SysDept::getDeptName, SysDept::getLeader)
.eq(SysDept::getStatus, SystemConstants.NORMAL)
.in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds));
}
/** /**
* 通过部门ID查询部门名称 * 通过部门ID查询部门名称
* *

View File

@ -23,6 +23,8 @@ import org.dromara.common.core.utils.*;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mps.domain.MpsMarket;
import org.dromara.mps.mapper.MpsMarketMapper;
import org.dromara.system.domain.*; import org.dromara.system.domain.*;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.domain.vo.SysPostVo;
@ -55,6 +57,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysPostMapper postMapper; private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper; private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper; private final SysUserPostMapper userPostMapper;
private final MpsMarketMapper mpsMarketMapper;
@Override @Override
public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) { public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@ -513,6 +516,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/ */
private void insertUserPost(SysUserBo user, boolean clear) { private void insertUserPost(SysUserBo user, boolean clear) {
Long[] posts = user.getPostIds(); Long[] posts = user.getPostIds();
if (posts.length >1) {
throw new ServiceException("用户" + user.getUserName() + "不能添加多个岗位");
}
if (ArrayUtil.isNotEmpty(posts)) { if (ArrayUtil.isNotEmpty(posts)) {
if (clear) { if (clear) {
// 删除用户与岗位关联 // 删除用户与岗位关联
@ -599,6 +605,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int deleteUserById(Long userId) { public int deleteUserById(Long userId) {
SysUserVo user = selectUserById(userId);
//校验是否有营销数据若yxid或jbid等于user.getMktNo()则提示用户有营销数据请先删除营销数据
if (mpsMarketMapper.selectCount(new LambdaQueryWrapper<MpsMarket>().eq(MpsMarket::getYxId, user.getMktNo())) > 0 ||
mpsMarketMapper.selectCount(new LambdaQueryWrapper<MpsMarket>().eq(MpsMarket::getJbId, user.getMktNo())) > 0) {
throw new ServiceException("用户有营销数据,请先删除营销数据");
};
// 删除用户与角色关联 // 删除用户与角色关联
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId)); userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
// 删除用户与岗位表 // 删除用户与岗位表
@ -623,6 +635,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
for (Long userId : userIds) { for (Long userId : userIds) {
checkUserAllowed(userId); checkUserAllowed(userId);
checkUserDataScope(userId); checkUserDataScope(userId);
SysUserVo user = selectUserById(userId);
//校验是否有营销数据若yxid或jbid等于user.getMktNo()则提示用户有营销数据请先删除营销数据
if (mpsMarketMapper.selectCount(new LambdaQueryWrapper<MpsMarket>().eq(MpsMarket::getYxId, user.getMktNo())) > 0 ||
mpsMarketMapper.selectCount(new LambdaQueryWrapper<MpsMarket>().eq(MpsMarket::getJbId, user.getMktNo())) > 0) {
throw new ServiceException("用户有营销数据,请先删除营销数据");
};
} }
List<Long> ids = List.of(userIds); List<Long> ids = List.of(userIds);
// 删除用户与角色关联 // 删除用户与角色关联