Browse Source

fix:成本服务和无处罚开具

master
“wangzihua” 3 months ago
parent
commit
4e42fc250a
  1. 2
      .env.development
  2. 2
      .env.localhost
  3. 4
      .env.pre
  4. 2
      .env.production
  5. 2
      .env.test
  6. 48
      src/api/business/cost/firm-reports-api.js
  7. 2
      src/api/support/file-api.js
  8. 2
      src/config/app-config.js
  9. 59
      src/constants/business/erp/cost-const.js
  10. 11
      src/layout/components/side-menu/index.vue
  11. 2
      src/layout/components/smart-footer/index.vue
  12. 6
      src/layout/components/top-menu/index.vue
  13. 4
      src/theme/custom-variables.js
  14. 255
      src/views/business/erp/cost/firm-reports-form.vue
  15. 403
      src/views/business/erp/cost/firm-reports-list.vue
  16. 4
      src/views/business/erp/service/service-applications-form.vue
  17. 5
      src/views/system/account/components/center/index.vue
  18. 3
      src/views/system/employee/components/employee-form-modal/index.vue
  19. 6
      src/views/system/employee/components/employee-list/index.vue
  20. 198
      src/views/system/home/components/agreement-modal.vue
  21. 6
      src/views/system/home/home-header.vue
  22. 8
      src/views/system/home/home-notice.vue
  23. 23
      src/views/system/home/index.vue
  24. 2
      src/views/system/login3/login.vue
  25. 7
      src/views/system/position/position-form.vue
  26. 8
      src/views/system/role/components/role-data-scope/index.vue
  27. 8
      vite.config.js

2
.env.development

@ -1,3 +1,3 @@
NODE_ENV=development
VITE_APP_TITLE='律师公益法律服务活动申报与管理平台'
VITE_APP_TITLE='律师公益法律服务活动申报子系统'
VITE_APP_API_URL='/api'

2
.env.localhost

@ -1,3 +1,3 @@
NODE_ENV=development
VITE_APP_TITLE='律师公益法律服务活动申报与管理平台'
VITE_APP_TITLE='律师公益法律服务活动申报子系统'
VITE_APP_API_URL='/api'

4
.env.pre

@ -1,3 +1,3 @@
NODE_ENV=production
VITE_APP_TITLE='律师公益法律服务活动申报与管理平台'
VITE_APP_API_URL='https://preview.smartadmin.vip/smart-admin-api'
VITE_APP_TITLE='律师公益法律服务活动申报子系统'
VITE_APP_API_URL='/api'

2
.env.production

@ -1,3 +1,3 @@
NODE_ENV=production
VITE_APP_TITLE='律师公益法律服务活动申报与管理平台'
VITE_APP_TITLE='律师公益法律服务活动申报子系统'
VITE_APP_API_URL='/api'

2
.env.test

@ -1,3 +1,3 @@
NODE_ENV=production
VITE_APP_TITLE='律师公益法律服务活动申报与管理平台'
VITE_APP_TITLE='律师公益法律服务活动申报子系统'
VITE_APP_API_URL='/api'

48
src/api/business/cost/firm-reports-api.js

@ -0,0 +1,48 @@
/**
* 律师事务所年度经营报表 api 封装
*
* @Author: wzh
* @Date: 2026-01-07 15:57:43
* @Copyright 1.0
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const firmReportsApi = {
/**
* 分页查询 @author wzh
*/
queryPage : (param) => {
return postRequest('/firmReports/queryPage', param);
},
/**
* 增加 @author wzh
*/
add: (param) => {
return postRequest('/firmReports/add', param);
},
/**
* 修改 @author wzh
*/
update: (param) => {
return postRequest('/firmReports/update', param);
},
/**
* 删除 @author wzh
*/
delete: (id) => {
return getRequest(`/firmReports/delete/${id}`);
},
/**
* 批量删除 @author wzh
*/
batchDelete: (idList) => {
return postRequest('/firmReports/batchDelete', idList);
},
};

2
src/api/support/file-api.js

@ -40,6 +40,6 @@ export const fileApi = {
* 根据文件ID列表获取文件信息 @author 系统
*/
getFileList: (fileIds) => {
return postRequest('/support/file/getFileList', { fileIds });
return getRequest('/support/file/getFileList', { fileIds });
},
};

2
src/config/app-config.js

@ -37,7 +37,7 @@ export const appDefaultConfig = {
// 水印
watermarkFlag: true,
// 网站名称
websiteName: '律师公益服务平台',
websiteName: '律师公益法律服务活动申报子系统',
// 主题颜色
primaryColor: '#1677ff',
// 紧凑

59
src/constants/business/erp/cost-const.js

@ -0,0 +1,59 @@
/*
* 成本管理常量
*/
// 季度枚举
export const QUARTER_ENUM = {
Q1: {
value: 'Q1',
desc: '第一季度',
},
Q2: {
value: 'Q2',
desc: '第二季度',
},
Q3: {
value: 'Q3',
desc: '第三季度',
},
Q4: {
value: 'Q4',
desc: '第四季度',
},
};
// 审核状态枚举
export const REVIEW_STATUS_ENUM = {
DRAFT: {
value: 0,
desc: '待提交',
},
SUBMITTED: {
value: 1,
desc: '待审批',
},
APPROVED: {
value: 2,
desc: '审批中',
},
REJECTED: {
value: 3,
desc: '已通过',
},
REFUSE: {
value: 4,
desc: '拒绝',
},
};
// 成本类型枚举
export const COST_TYPE_ENUM = {
PUBLIC_WELFARE: {
value: 1,
desc: '公益活动成本',
},
OTHER: {
value: 2,
desc: '其他成本',
},
};

11
src/layout/components/side-menu/index.vue

@ -1,11 +1,5 @@
<!--
* 传统菜单
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-06 20:29:12
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<!--左侧菜单分为两部分1顶部logo区域包含 logo和名称;2下方菜单区域-->
@ -99,14 +93,13 @@
.logo {
height: @header-user-height;
line-height: @header-user-height;
line-height: normal;
background-color: v-bind('color.background');
padding: 0px 15px 0px 15px;
position: fixed;
z-index: 21;
display: flex;
cursor: pointer;
justify-content: center;
align-items: center;
.logo-img {
@ -118,6 +111,8 @@
font-size: 16px;
font-weight: 600;
margin-left: 8px;
line-height: 1.2;
padding: 4px 0;
}
.title-light {
color: #001529;

2
src/layout/components/smart-footer/index.vue

@ -3,7 +3,7 @@
-->
<template>
<div class="version">
<a target="_blank" class="smart-copyright">{{ currentYear }}@ 律师公益法律服务活动申报与管理平台 </a>
<a target="_blank" class="smart-copyright">{{ currentYear }}@ 律师公益法律服务活动申报子系统</a><a style="margin-left:20px">服务经理:王浩</a><a style="margin-left:10px">联系方式:18226700205</a>
</div>
</template>
<script setup>

6
src/layout/components/top-menu/index.vue

@ -1,11 +1,5 @@
<!--
* 顶部菜单
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-06 20:29:12
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<!--总共3部分1logo区域包含 logo和名称; 2菜单区域 ;3用户操作区域-->

4
src/theme/custom-variables.js

@ -12,8 +12,8 @@ export default {
'@hover-bg-color': 'rgba(0, 0, 0, 0.025)',
'@hover-bg-color-night': 'rgba(255, 255, 255, 0.025)',
'@header-light-bg-hover-color': '#f6f6f6',
'@header-height': '80px',
'@header-user-height': '40px',
'@header-height': '100px',
'@header-user-height': '60px',
'@page-tag-height': '40px',
'@theme-list': ['light', 'dark', 'night'],
};

255
src/views/business/erp/cost/firm-reports-form.vue

@ -0,0 +1,255 @@
<!--
* 律师事务所年度经营报表
*
* @Author: wzh
* @Date: 2026-01-07 15:57:43
* @Copyright 1.0
-->
<template>
<a-modal
:title="form.id ? '编辑成本填报' : '新建成本填报'"
:width="600"
:open="visibleFlag"
@cancel="onClose"
:maskClosable="false"
:destroyOnClose="true"
>
<a-form ref="formRef" :model="form" :rules="rules" :label-col="{ span: 6 }" >
<a-form-item label="律师事务所">
<a-input v-model:value="departmentName" placeholder="律师事务所" disabled />
</a-form-item>
<a-form-item label="季度" name="declareQuarter">
<DictSelect
dict-code="QUARTER"
v-model:value="form.declareQuarter"
placeholder="请选择季度"
@change="calculateCosts"
style="width: 100%"
/>
</a-form-item>
<a-form-item label="律所收入(万元)" name="revenue">
<a-input-number
style="width: 100%"
v-model:value="form.revenue"
placeholder="请输入律所总收入"
:min="0"
:precision="2"
@change="calculateCosts"
addon-after="万元"
/>
</a-form-item>
<a-form-item label="公益活动成本(万元)" name="publicWelfareCost">
<a-input-number
style="width: 100%"
v-model:value="form.publicWelfareCost"
placeholder="请输入公益活动成本"
:min="0"
:precision="2"
@change="calculateCosts"
addon-after="万元"
/>
</a-form-item>
<a-form-item label="其他成本(万元)" name="otherCost">
<a-input-number
style="width: 100%"
v-model:value="form.otherCost"
placeholder="请输入其他成本"
:min="0"
:precision="2"
@change="calculateCosts"
addon-after="万元"
/>
</a-form-item>
<a-row>
<a-col :span="12">
<a-form-item label="总成本(万元)" :label-col="{ span: 12 }" :wrapper-col="{ span: 12 }">
<a-input-number
style="width: 100%"
v-model:value="form.totalCost"
:precision="2"
disabled
addon-after="万元"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="成本/收入比例" :label-col="{ span: 12 }" :wrapper-col="{ span: 12 }">
<a-input
style="width: 100%"
v-model:value="form.costIncomeRatio"
disabled
addon-after="%"
/>
</a-form-item>
</a-col>
</a-row>
<a-form-item label="报表年份" name="declareYear">
<a-input-number
style="width: 100%"
v-model:value="form.declareYear"
placeholder="请输入报表年份"
disabled
:min="2000"
:max="2100"
/>
</a-form-item>
</a-form>
<template #footer>
<a-space>
<a-button @click="onClose">取消</a-button>
<a-button @click="saveAsDraft" type="default" v-if="!form.id">保存草稿</a-button>
<a-button type="primary" @click="submitForReview">提交审核</a-button>
</a-space>
</template>
</a-modal>
</template>
<script setup>
import { reactive, ref, nextTick, computed } from 'vue';
import _ from 'lodash';
import { message } from 'ant-design-vue';
import { SmartLoading } from '/@/components/framework/smart-loading';
import { firmReportsApi } from '/@/api/business/cost/firm-reports-api';
import { smartSentry } from '/@/lib/smart-sentry';
import { useUserStore } from '/@/store/modules/system/user';
import DictSelect from '/@/components/support/dict-select/index.vue';
// ------------------------ ------------------------
const emits = defineEmits(['reloadList']);
// ------------------------ ------------------------
const userStore = useUserStore();
//
const departmentName = computed(() => userStore.departmentName);
// ID
const departmentId = computed(() => userStore.departmentId);
// ------------------------ ------------------------
//
const visibleFlag = ref(false);
function show(rowData) {
Object.assign(form, formDefault);
// IDID
form.firmId = departmentId.value;
if (rowData && !_.isEmpty(rowData)) {
Object.assign(form, rowData);
}
visibleFlag.value = true;
nextTick(() => {
formRef.value.clearValidate();
//
calculateCosts();
});
}
function onClose() {
Object.assign(form, formDefault);
visibleFlag.value = false;
}
// ------------------------ ------------------------
// ref
const formRef = ref();
const formDefault = {
id: undefined,
firmId: undefined, // IDID
declareYear: new Date().getFullYear(), //
declareQuarter: undefined, // ID (1,2,3,4)
revenue: undefined, //
totalCost: 0, //
publicWelfareCost: undefined, //
costIncomeRatio: '0.00', // %
};
let form = reactive({ ...formDefault });
const rules = {
declareQuarter: [{ required: true, message: '请选择季度' }],
declareYear: [{ required: true, message: '请输入报表年份' }],
revenue: [{ required: true, message: '请输入律所收入' }],
publicWelfareCost: [{ required: true, message: '请输入公益活动成本' }],
};
// /
function calculateCosts() {
const revenue = parseFloat(form.revenue) || 0;
const publicWelfareCost = parseFloat(form.publicWelfareCost) || 0;
const otherCost = parseFloat(form.otherCost) || 0;
//
const totalCost = publicWelfareCost + otherCost;
form.totalCost = totalCost;
// /
if (revenue > 0) {
const ratio = (totalCost / revenue) * 100;
form.costIncomeRatio = ratio.toFixed(2);
} else {
form.costIncomeRatio = '0.00';
}
}
// 稿
async function saveAsDraft() {
try {
await formRef.value.validateFields(['declareQuarter', 'declareYear', 'revenue', 'publicWelfareCost']);
form.approvalStatus = '0'; // 稿
await save();
message.success('保存草稿成功');
} catch (err) {
message.error('请填写必填字段后再保存草稿!');
}
}
//
async function submitForReview() {
try {
await formRef.value.validateFields();
form.approvalStatus = '1'; //
await save();
message.success('提交审核成功');
} catch (err) {
message.error('参数验证错误,请仔细填写表单数据!');
}
}
// API
async function save() {
SmartLoading.show();
try {
//
calculateCosts();
if (form.id) {
await firmReportsApi.update(form);
} else {
await firmReportsApi.add(form);
}
emits('reloadList');
onClose();
} catch (err) {
smartSentry.captureError(err);
} finally {
SmartLoading.hide();
}
}
defineExpose({
show,
});
</script>

403
src/views/business/erp/cost/firm-reports-list.vue

@ -0,0 +1,403 @@
<!--
* 律师事务所年度经营报表
*
* @Author: wzh
* @Date: 2026-01-07 15:57:43
* @Copyright 1.0
-->
<template>
<!---------- 查询表单form begin ----------->
<a-form class="smart-query-form">
<a-row class="smart-query-form-row">
<a-form-item label="律师事务所" class="smart-query-form-item">
<DepartmentTreeSelect style="width: 150px" v-model:value="queryForm.firmId" placeholder="请选择律师事务所" />
</a-form-item>
<a-form-item label="报表年份" class="smart-query-form-item">
<a-input style="width: 150px" v-model:value="queryForm.declareYear" placeholder="请输入报表年份" />
</a-form-item>
<a-form-item label="报表季度" class="smart-query-form-item">
<DictSelect
dict-code="QUARTER"
v-model:value="queryForm.declareQuarter"
placeholder="请选择季度"
style="width: 100px"
/>
</a-form-item>
<a-form-item class="smart-query-form-item" style="margin-left: 120px;">
<a-button type="primary" @click="onSearch">
<template #icon>
<SearchOutlined />
</template>
查询
</a-button>
<a-button @click="resetQuery" class="smart-margin-left10">
<template #icon>
<ReloadOutlined />
</template>
重置
</a-button>
</a-form-item>
</a-row>
</a-form>
<!---------- 查询表单form end ----------->
<a-card size="small" :bordered="false" :hoverable="true">
<!---------- 表格操作行 begin ----------->
<a-row class="smart-table-btn-block">
<div class="smart-table-operate-block">
<a-button @click="showForm" type="primary" >
<template #icon>
<PlusOutlined />
</template>
新建
</a-button>
<a-button @click="confirmBatchDelete" type="primary" danger :disabled="selectedRowKeyList.length == 0">
<template #icon>
<DeleteOutlined />
</template>
批量删除
</a-button>
</div>
<div class="smart-table-setting-block">
<TableOperator v-model="columns" :tableId="null" :refresh="queryData" />
</div>
</a-row>
<!---------- 表格操作行 end ----------->
<!---------- 表格 begin ----------->
<a-table
size="small"
:scroll="{ y: 800 }"
:dataSource="tableData"
:columns="columns"
rowKey="id"
bordered
:loading="tableLoading"
:pagination="false"
:row-selection="{ selectedRowKeys: selectedRowKeyList, onChange: onSelectChange }"
>
<template #bodyCell="{ text, record, column }">
<template v-if="column.dataIndex === 'action'">
<div class="smart-table-operate">
<!--<a-button v-if="record.approvalStatus === 0 || record.approvalStatus === 4" @click="showForm(record)" type="link">编辑</a-button>-->
<a-button v-if="record.approvalStatus === 0" @click="onSubmit(record)" type="link">提交</a-button>
<a-button v-if="record.approvalStatus === 1 || record.approvalStatus === 2" @click="showAuditModal(record)" type="link">审核</a-button>
<a-button @click="onDelete(record)" danger type="link">删除</a-button>
</div>
</template>
</template>
</a-table>
<!---------- 表格 end ----------->
<div class="smart-query-table-page">
<a-pagination
showSizeChanger
showQuickJumper
show-less-items
:pageSizeOptions="PAGE_SIZE_OPTIONS"
:defaultPageSize="queryForm.pageSize"
v-model:current="queryForm.pageNum"
v-model:pageSize="queryForm.pageSize"
:total="total"
@change="queryData"
@showSizeChange="queryData"
:show-total="(total) => `共${total}条`"
/>
</div>
<FirmReportsForm ref="formRef" @reloadList="queryData"/>
</a-card>
</template>
<script setup>
import { reactive, ref, onMounted } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { SmartLoading } from '/@/components/framework/smart-loading';
import { firmReportsApi } from '/@/api/business/cost/firm-reports-api';
import { PAGE_SIZE_OPTIONS } from '/@/constants/common-const';
import { smartSentry } from '/@/lib/smart-sentry';
import TableOperator from '/@/components/support/table-operator/index.vue';
import FirmReportsForm from './firm-reports-form.vue';
import { REVIEW_STATUS_ENUM } from '/@/constants/business/erp/cost-const';
import DepartmentTreeSelect from '/@/components/system/department-tree-select/index.vue';
import DictSelect from '/@/components/support/dict-select/index.vue';
// ---------------------------- ----------------------------
const columns = ref([
{
title: '律师事务所',
dataIndex: 'firmName',
ellipsis: true,
},
{
title: '报表年份',
dataIndex: 'declareYear',
ellipsis: true,
},
{
title: '报表季度',
dataIndex: 'declareQuarter',
ellipsis: true,
},
{
title: '营业收入(单位:万元)',
dataIndex: 'revenue',
ellipsis: true,
},
{
title: '总成本支出(单位:万元)',
dataIndex: 'totalCost',
ellipsis: true,
},
{
title: '公益成本支出(单位:万元)',
dataIndex: 'publicWelfareCost',
ellipsis: true,
},
{
title: '成本收入比',
dataIndex: 'costIncomeRatio',
ellipsis: true,
customRender: ({ text }) => {
return text ? `${text}%` : '';
},
},
{
title: '审批状态',
dataIndex: 'approvalStatus',
ellipsis: true,
customRender: ({ text }) => {
const status = Object.values(REVIEW_STATUS_ENUM).find(item => item.value === text);
return status ? status.desc : text;
},
},
{
title: '提交时间',
dataIndex: 'submissionTime',
ellipsis: true,
},
{
title: '审批人',
dataIndex: 'approverId',
ellipsis: true,
},
{
title: '操作',
dataIndex: 'action',
fixed: 'right',
width: 150,
},
]);
// ---------------------------- ----------------------------
const queryFormState = {
pageNum: 1,
pageSize: 10,
firmId: undefined, // ID
declareYear: undefined, //
declareQuarter: undefined, //
};
// form
const queryForm = reactive({ ...queryFormState });
// loading
const tableLoading = ref(false);
//
const tableData = ref([]);
//
const total = ref(0);
//
function resetQuery() {
let pageSize = queryForm.pageSize;
Object.assign(queryForm, queryFormState);
queryForm.pageSize = pageSize;
queryData();
}
//
function onSearch(){
queryForm.pageNum = 1;
queryData();
}
//
async function queryData() {
tableLoading.value = true;
try {
let queryResult = await firmReportsApi.queryPage(queryForm);
tableData.value = queryResult.data.list;
total.value = queryResult.data.total;
} catch (e) {
smartSentry.captureError(e);
} finally {
tableLoading.value = false;
}
}
// ---------------------------- ----------------------------
//
function onSubmit(data){
Modal.confirm({
title: '提示',
content: '确定要提交该成本报表吗?',
okText: '提交',
okType: 'primary',
onOk() {
requestSubmit(data);
},
cancelText: '取消',
onCancel() {},
});
}
//
async function requestSubmit(data){
try {
SmartLoading.show();
await firmReportsApi.submit(data.reportId);
message.success('提交成功');
queryData();
} catch (e) {
smartSentry.captureError(e);
} finally {
SmartLoading.hide();
}
}
// ---------------------------- ----------------------------
//
const auditModalVisible = ref(false);
const auditLoading = ref(false);
const currentAuditRecord = ref(null);
const auditForm = reactive({
auditResult: 3, //
auditRemark: ''
});
//
function showAuditModal(record) {
currentAuditRecord.value = record;
auditForm.auditResult = 3;
auditForm.auditRemark = '';
auditModalVisible.value = true;
}
//
async function handleAudit() {
if (!currentAuditRecord.value) {
message.error('未选择审核记录');
return;
}
auditLoading.value = true;
const auditData = {
reportId: currentAuditRecord.value.reportId,
approvalStatus: auditForm.auditResult
};
try {
await firmReportsApi.review(auditData);
message.success('审核成功');
auditModalVisible.value = false;
queryData();
} catch (error) {
message.error('审核失败');
console.error('审核失败:', error);
} finally {
auditLoading.value = false;
}
}
//
function handleAuditCancel() {
auditModalVisible.value = false;
currentAuditRecord.value = null;
auditForm.auditResult = 3;
auditForm.auditRemark = '';
}
onMounted(queryData);
// ---------------------------- / ----------------------------
const formRef = ref();
function showForm(data) {
formRef.value.show(data);
}
// ---------------------------- ----------------------------
//
function onDelete(data){
Modal.confirm({
title: '提示',
content: '确定要删除选吗?',
okText: '删除',
okType: 'danger',
onOk() {
requestDelete(data);
},
cancelText: '取消',
onCancel() {},
});
}
//
async function requestDelete(data){
SmartLoading.show();
try {
await firmReportsApi.delete(data.id);
message.success('删除成功');
queryData();
} catch (e) {
smartSentry.captureError(e);
} finally {
SmartLoading.hide();
}
}
// ---------------------------- ----------------------------
//
const selectedRowKeyList = ref([]);
function onSelectChange(selectedRowKeys) {
//
if (selectedRowKeys.length > 1) {
selectedRowKeyList.value = [selectedRowKeys[selectedRowKeys.length - 1]];
} else {
selectedRowKeyList.value = selectedRowKeys;
}
}
//
function confirmBatchDelete() {
Modal.confirm({
title: '提示',
content: '确定要批量删除这些数据吗?',
okText: '删除',
okType: 'danger',
onOk() {
requestBatchDelete();
},
cancelText: '取消',
onCancel() {},
});
}
//
async function requestBatchDelete() {
try {
SmartLoading.show();
await firmReportsApi.batchDelete(selectedRowKeyList.value);
message.success('删除成功');
queryData();
} catch (e) {
smartSentry.captureError(e);
} finally {
SmartLoading.hide();
}
}
</script>

4
src/views/business/erp/service/service-applications-form.vue

@ -366,6 +366,10 @@
function onClose() {
Object.assign(form, formDefault);
//
defaultFileList.value = [];
form.proofMaterials = [];
form.attachmentIds = '';
visibleFlag.value = false;
}

5
src/views/system/account/components/center/index.vue

@ -36,9 +36,6 @@
<a-form-item label="邮箱" name="email">
<a-input v-model:value.trim="form.email" placeholder="请输入邮箱" />
</a-form-item>
<a-form-item label="职务" name="positionId">
<PositionSelect v-model:value="form.positionId" placeholder="请选择职务" />
</a-form-item>
<a-form-item label="备注" name="remark">
<a-textarea class="form-item" v-model:value="form.remark" placeholder="请输入备注" :rows="4" />
</a-form-item>
@ -114,8 +111,6 @@
departmentId: undefined,
//
email: undefined,
//
positionId: undefined,
//
disabledFlag: undefined,
//

3
src/views/system/employee/components/employee-form-modal/index.vue

@ -47,9 +47,6 @@
<a-select-option :value="1">禁用</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="职务" name="positionId">
<PositionSelect v-model:value="form.positionId" placeholder="请选择职务" />
</a-form-item>
<a-form-item label="角色" name="roleIdList">
<a-select mode="multiple" v-model:value="form.roleIdList" optionFilterProp="title" placeholder="请选择角色">

6
src/views/system/employee/components/employee-list/index.vue

@ -169,12 +169,6 @@
dataIndex: 'disabledFlag',
width: 60,
},
{
title: '职务',
dataIndex: 'positionName',
width: 100,
ellipsis: true,
},
{
title: '角色',
dataIndex: 'roleNameList',

198
src/views/system/home/components/agreement-modal.vue

@ -0,0 +1,198 @@
<template>
<a-modal
v-model:visible="visible"
:title="noticeDetail.title || '平台协议'"
width="800px"
:maskClosable="false"
:keyboard="false"
:closable="false"
>
<a-spin :spinning="loading">
<div class="agreement-content">
<div v-if="noticeDetail.title" class="agreement-text">
<div class="content-header">
<h3>{{ noticeDetail.title }}</h3>
<div class="content-header-info">
<span v-if="noticeDetail.author">作者{{ noticeDetail.author }}</span>
<span v-if="noticeDetail.source">来源{{ noticeDetail.source }}</span>
<span v-if="noticeDetail.publishTime">发布时间{{ noticeDetail.publishTime }}</span>
</div>
</div>
<div class="content-html" v-html="noticeDetail.contentHtml"></div>
<div v-if="!noticeDetail.contentHtml" class="default-content">
<p>欢迎使用本系统在开始使用前请仔细阅读以下协议内容</p>
<h4>服务条款</h4>
<p>1. 您在使用本系统时必须遵守相关法律法规和平台规定</p>
<p>2. 不得利用本系统从事任何违法或不当行为</p>
<h4>隐私政策</h4>
<p>1. 我们将保护您的个人信息安全仅用于系统功能使用</p>
<p>2. 未经您同意我们不会向第三方泄露您的个人信息</p>
<h4>使用规范</h4>
<p>1. 请妥善保管您的账号密码避免泄露</p>
<p>2. 如发现异常情况请及时联系系统管理员</p>
</div>
<p class="important">请仔细阅读以上协议内容点击"同意并继续"表示您已阅读并同意本协议</p>
</div>
<div v-else class="agreement-text">
<h3>用户协议与隐私政策</h3>
<div class="default-content">
<p>欢迎使用本系统在开始使用前请仔细阅读以下协议内容</p>
<h4>服务条款</h4>
<p>1. 您在使用本系统时必须遵守相关法律法规和平台规定</p>
<p>2. 不得利用本系统从事任何违法或不当行为</p>
<h4>隐私政策</h4>
<p>1. 我们将保护您的个人信息安全仅用于系统功能使用</p>
<p>2. 未经您同意我们不会向第三方泄露您的个人信息</p>
<h4>使用规范</h4>
<p>1. 请妥善保管您的账号密码避免泄露</p>
<p>2. 如发现异常情况请及时联系系统管理员</p>
</div>
<p class="important">请仔细阅读以上协议内容点击"同意并继续"表示您已阅读并同意本协议</p>
</div>
</div>
</a-spin>
<template #footer>
<a-button @click="handleCancel" size="large">不同意</a-button>
<a-button type="primary" @click="handleConfirm" size="large">同意并继续</a-button>
</template>
</a-modal>
</template>
<script setup>
import { ref, onMounted, reactive } from 'vue';
import { noticeApi } from '/@/api/business/oa/notice-api';
import { smartSentry } from '/@/lib/smart-sentry';
const emit = defineEmits(['confirm', 'cancel']);
const visible = ref(false);
const loading = ref(false);
//
const noticeDetail = reactive({
title: '',
contentHtml: '',
author: '',
source: '',
publishTime: ''
});
onMounted(() => {
visible.value = true;
//
getFirstNoticeDetail();
});
//
async function getFirstNoticeDetail() {
try {
loading.value = true;
// ID1
const queryForm = {
noticeTypeId: 1,
pageNum: 1,
pageSize: 1,
searchCount: false,
};
const result = await noticeApi.queryEmployeeNotice(queryForm);
if (result.data && result.data.list && result.data.list.length > 0) {
const firstNotice = result.data.list[0];
//
const detailResult = await noticeApi.view(firstNotice.noticeId);
if (detailResult.data) {
Object.assign(noticeDetail, detailResult.data);
}
}
} catch (err) {
smartSentry.captureError(err);
console.error('获取公告详情失败:', err);
} finally {
loading.value = false;
}
}
const handleConfirm = () => {
emit('confirm');
visible.value = false;
};
const handleCancel = () => {
emit('cancel');
visible.value = false;
};
</script>
<style scoped>
.agreement-content {
max-height: 400px;
overflow-y: auto;
padding: 0 10px;
}
.agreement-text {
line-height: 1.6;
}
.content-header {
border-bottom: 1px solid #e8e8e8;
padding-bottom: 15px;
margin-bottom: 20px;
}
.content-header h3 {
text-align: center;
color: #1890ff;
margin-bottom: 10px;
font-size: 18px;
}
.content-header-info {
text-align: center;
color: #666;
font-size: 12px;
}
.content-header-info span {
margin: 0 10px;
}
.content-html {
margin-bottom: 20px;
}
.content-html >>> p {
margin-bottom: 10px;
line-height: 1.6;
}
.content-html >>> h4 {
color: #333;
margin: 15px 0 10px 0;
}
.default-content h4 {
color: #333;
margin: 15px 0 10px 0;
}
.default-content p {
margin-bottom: 8px;
color: #666;
}
.important {
color: #ff4d4f !important;
font-weight: bold;
margin-top: 20px !important;
text-align: center;
}
</style>

6
src/views/system/home/home-header.vue

@ -1,12 +1,6 @@
<!--
* 首页 用户头部信息
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 22:34:00
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-card class="user-header">

8
src/views/system/home/home-notice.vue

@ -1,17 +1,11 @@
<!--
* 首页的 通知公告
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 22:34:00
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<default-home-card extra="更多" icon="SoundOutlined" title="通知公告" @extraClick="onMore">
<a-spin :spinning="loading">
<div class="content-wrapper">
<div class="content-wrapper" style="height: 280px">
<a-empty v-if="$lodash.isEmpty(data)" />
<ul v-else>
<li v-for="(item, index) in data" :key="index" :class="[item.viewFlag ? 'read' : 'un-read']">

23
src/views/system/home/index.vue

@ -15,24 +15,22 @@
<!--左侧-->
<a-col :span="16">
<a-row :gutter="[10, 10]">
<!--公告信息-->
<!--公告信息
<a-col :span="12">
<HomeNotice title="公告" :noticeTypeId="1" />
</a-col>
</a-col>-->
<!--企业动态-->
<a-col :span="12">
<a-col :span="24">
<HomeNotice title="通知" :noticeTypeId="2" />
</a-col>
<!--各类报表-->
<!-- <a-col :span="6">
<Gauge :percent="saleTargetPercent" />
</a-col> -->
<a-col :span="12">
<ToBeDoneCard />
</a-col>
<a-col :span="12">
<!-- <a-col :span="12">
<Category />
</a-col>
</a-col>-->
</a-row>
</a-col>
<!--右侧-->
@ -42,14 +40,17 @@
<!-- <a-col :span="24">
<HomeQuickEntry />
</a-col> -->
<!--关注公众号-->
<!--关注公众号
<a-col :span="24">
<OfficialAccountCard />
</a-col>-->
<a-col :span="24">
<ToBeDoneCard />
</a-col>
<!--更新日志-->
<!--更新日志
<a-col :span="24">
<ChangelogCard />
</a-col>
</a-col>-->
</a-row>
</a-col>
<!-- <AdModal/>-->

2
src/views/system/login3/login.vue

@ -7,7 +7,7 @@
<div class="box-item desc">
<div class="welcome">
<p>欢迎登录</p>
<p class="sub-welcome">高质量简洁高效安全的律政平台</p>
<p class="sub-welcome"> </p>
</div>
<img class="welcome-img" :src="loginGif" />
</div>

7
src/views/system/position/position-form.vue

@ -1,9 +1,6 @@
<!--
* 职务表
*
* @Author: kaiyun
* @Date: 2024-06-23 23:31:38
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
-->
<template>
<a-modal
@ -16,9 +13,7 @@
forceRender
>
<a-form ref="formRef" :model="form" :rules="rules" :label-col="{ span: 6 }">
<a-form-item label="职务名称" name="positionName">
<a-input style="width: 100%" v-model:value="form.positionName" placeholder="职务名称" />
</a-form-item>
<a-form-item label="职级" name="positionLevel">
<a-input style="width: 100%" v-model:value="form.positionLevel" placeholder="职级" />
</a-form-item>

8
src/views/system/role/components/role-data-scope/index.vue

@ -1,12 +1,6 @@
<!--
* 角色 数据范围
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 22:34:00
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<div>
@ -15,7 +9,7 @@
<a-button class="button-style" @click="getDataScope"> 刷新 </a-button>
</div>
<a-row class="header">
<a-col class="tab-margin" :span="4">业务单据</a-col>
<a-col class="tab-margin" :span="4">业务</a-col>
<a-col class="tab-data" :span="8">查看数据范围</a-col>
<a-col class="tab-margin" :span="12" />
</a-row>

8
vite.config.js

@ -35,14 +35,16 @@ export default {
proxy: {
// 代理API路径
'/api': {
target: 'http://8.148.67.92:8080/', // 目标服务器地址
//target: 'http://8.148.67.92:8080/', // 目标服务器地址
target: 'http://127.0.0.1:8080/',
changeOrigin: true, // 是否修改请求头中的 Origin 字段
rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径
},
'/login': {
target: 'http://8.148.67.92:8080/', // 目标服务器地址
//target: 'http://8.148.67.92:8080/', // 目标服务器地址
target: 'http://127.0.0.1:8080/',
changeOrigin: true, // 是否修改请求头中的 Origin 字段
rewrite: (path) => path, // 重写路径
rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径
},
}
},

Loading…
Cancel
Save