提交 005021d2 编写于 作者: ibizdev's avatar ibizdev

JunZai 发布系统代码

上级 66a1d142
......@@ -351,6 +351,14 @@ export default {
caption: "-",
tip: "",
},
tbitem5: {
caption: "Filter",
tip: "Filter",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "Help",
tip: "Help",
......
......@@ -350,6 +350,14 @@ export default {
caption: "-",
tip: "",
},
tbitem5: {
caption: "过滤",
tip: "过滤",
},
tbitem6: {
caption: "-",
tip: "",
},
tbitem7: {
caption: "帮助",
tip: "帮助",
......
......@@ -428,6 +428,95 @@ mock.onPost(new RegExp(/^\/hrarchives\/?([a-zA-Z0-9\-\;]{0,35})\/save$/)).reply(
});
// FetchActive
mock.onGet(new RegExp(/^\/hremployees\/([a-zA-Z0-9\-\;]{1,35})\/hrarchives\/fetchactive$/)).reply((config: any) => {
console.groupCollapsed("实体:hrarchives 方法: FetchActive");
console.table({url:config.url, method: config.method, data:config.data});
let status = MockAdapter.mockStatus(config);
if (status !== 200) {
return [status, null];
}
const paramArray:Array<any> = ['employeeid'];
let tempValue: any = {};
const matchArray:any = new RegExp(/^\/hremployees\/([a-zA-Z0-9\-\;]{1,35})\/hrarchives\/fetchactive$/).exec(config.url);
if(matchArray && matchArray.length >1 && paramArray && paramArray.length >0){
paramArray.forEach((item: any, index: number) => {
Object.defineProperty(tempValue, item, {
enumerable: true,
value: matchArray[index + 1]
});
});
}
let items = mockDatas ? mockDatas : [];
if (items.length > 0 && paramArray.length > 0) {
paramArray.forEach((paramkey: any) => {
if (tempValue[paramkey] && tempValue[paramkey].indexOf(";") > 0) {
let keysGrounp: Array<any> = tempValue[paramkey].split(new RegExp(/[\;]/));
let tempArray: Array<any> = [];
keysGrounp.forEach((singlekey: any) => {
let _items = items.filter((item: any) => { return item[paramkey] == singlekey });
if(_items.length >0){
tempArray.push(..._items);
}
})
items = tempArray;
} else {
items = items.filter((item: any) => { return item[paramkey] == tempValue[paramkey] });
}
})
}
console.groupCollapsed("response数据 status: "+status+" data: ");
console.table(items);
console.groupEnd();
console.groupEnd();
return [status, items];
});
// FetchActive
mock.onGet(new RegExp(/^\/hrarchives\/fetchactive$/)).reply((config: any) => {
console.groupCollapsed("实体:hrarchives 方法: FetchActive");
console.table({url:config.url, method: config.method, data:config.data});
let status = MockAdapter.mockStatus(config);
if (status !== 200) {
return [status, null];
}
console.groupCollapsed("response数据 status: "+status+" data: ");
console.table(mockDatas);
console.groupEnd();
console.groupEnd();
return [status, mockDatas ? mockDatas : []];
});
// FetchActive
mock.onGet(new RegExp(/^\/hrarchives\/fetchactive(\?[\w-./?%&=,]*)*$/)).reply((config: any) => {
console.groupCollapsed("实体:hrarchives 方法: FetchActive");
console.table({url:config.url, method: config.method, data:config.data});
if(config.url.includes('page')){
let url = config.url.split('?')[1];
let params = qs.parse(url);
Object.assign(config, params);
}
let status = MockAdapter.mockStatus(config);
if (status !== 200) {
return [status, null];
}
let total = mockDatas.length;
let records: Array<any> = [];
if(!config.page || !config.size){
records = mockDatas;
}else{
if((config.page-1)*config.size < total){
records = mockDatas.slice(config.page,config.size);
}
}
console.groupCollapsed("response数据 status: "+status+" data: ");
console.table(records ? records : []);
console.groupEnd();
console.groupEnd();
return [status, records ? records : []];
});
// FetchDefault
mock.onGet(new RegExp(/^\/hremployees\/([a-zA-Z0-9\-\;]{1,35})\/hrarchives\/fetchdefault$/)).reply((config: any) => {
console.groupCollapsed("实体:hrarchives 方法: FetchDefault");
......
......@@ -92,6 +92,7 @@ export class HRTransferApplyWFDynaExpGridViewBase extends ViewBase {
protected containerModel: any = {
view_toolbar: { name: 'toolbar', type: 'TOOLBAR' },
view_grid: { name: 'grid', type: 'GRID' },
view_searchform: { name: 'searchform', type: 'SEARCHFORM' },
wflinks: [],
};
......@@ -127,6 +128,9 @@ export class HRTransferApplyWFDynaExpGridViewBase extends ViewBase {
}
},
tbitem4: { name: 'tbitem4', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem5: { name: 'tbitem5', caption: '过滤', 'isShowCaption': true, 'isShowIcon': true, tooltip: '过滤', iconcls: 'fa fa-filter', icon: '', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'ToggleFilter', target: '', class: '' } },
tbitem6: { name: 'tbitem6', type: 'SEPERATOR', visabled: true, dataaccaction: '', uiaction: { } },
tbitem7: { name: 'tbitem7', caption: '帮助', 'isShowCaption': true, 'isShowIcon': true, tooltip: '帮助', iconcls: 'fa fa-question', icon: '', disabled: false, type: 'DEUIACTION', visabled: true,noprivdisplaymode:2,dataaccaction: '', uiaction: { tag: 'Help', target: '', class: '' } },
};
......@@ -168,6 +172,7 @@ export class HRTransferApplyWFDynaExpGridViewBase extends ViewBase {
this.newdata(args,fullargs, params, $event, xData);
},
grid: this.$refs.grid,
searchform: this.$refs.searchform,
keyPSDEField: 'hrtransferapply',
majorPSDEField: 'hrtransferapplyname',
isLoadDefault: true,
......@@ -281,6 +286,39 @@ export class HRTransferApplyWFDynaExpGridViewBase extends ViewBase {
this.engine.onCtrlEvent('grid', 'load', $event);
}
/**
* searchform 部件 save 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof HRTransferApplyWFDynaExpGridViewBase
*/
public searchform_save($event: any, $event2?: any): void {
this.engine.onCtrlEvent('searchform', 'save', $event);
}
/**
* searchform 部件 search 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof HRTransferApplyWFDynaExpGridViewBase
*/
public searchform_search($event: any, $event2?: any): void {
this.engine.onCtrlEvent('searchform', 'search', $event);
}
/**
* searchform 部件 load 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof HRTransferApplyWFDynaExpGridViewBase
*/
public searchform_load($event: any, $event2?: any): void {
this.engine.onCtrlEvent('searchform', 'load', $event);
}
/**
* 逻辑事件
*
......@@ -1099,7 +1137,9 @@ export class HRTransferApplyWFDynaExpGridViewBase extends ViewBase {
this.curSelectedNode = data;
this.setTreeNodeHighLight(this.curSelectedNode);
Object.assign(this.viewparams,{'userTaskId':data['userTaskId'],'processDefinitionKey':data['processDefinitionKey']});
(this.$refs.searchform as any).onSearch();
if(this.$refs.searchform) {
(this.$refs.searchform as any).onSearch();
}
}
/**
......
<studio-view-style2 viewName="hrtransferapplywfdynaexpgridview" viewTitle="调动申请工作流导航表格视图" class='dewfdynaexpgridview hrtransfer-apply-wfdyna-exp-grid-view'>
<template slot='title'>
<span class='caption-info'>{{viewCaption}}</span>
</template>
<i-input slot="quickSearch" v-model="query" placeholder="调动申请名称" search @on-search="onSearch($event)"/>
<template slot="toolbar">
<view-toolbar mode="STYLE2" :model="toolBarModels" @item-click="toolbar_click.apply(_self, arguments)"/> </template>
<split id="hrtransferapplywfdynaexpgridview" v-model="split" mode="horizontal">
<div slot='left'>
<el-tree ref="tree" :data="wfStepModel" node-key="userTaskId" :highlight-current="true" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</div>
<div slot="right">
<div class="content-container">
<view_grid
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:isSingleSelect="isGridSingleSelect"
:showBusyIndicator="true"
updateAction=""
removeAction="Remove"
loaddraftAction=""
loadAction=""
createAction=""
fetchAction="FetchDefault"
:newdata="newdata.bind(_self)"
:opendata="opendata.bind(_self)"
name="grid"
ref='grid'
@selectionchange="grid_selectionchange($event)"
@beforeload="grid_beforeload($event)"
@rowdblclick="grid_rowdblclick($event)"
@remove="grid_remove($event)"
@load="grid_load($event)"
@closeview="closeView($event)">
</view_grid>
</div>
</div>
</split>
<split id="hrtransferapplywfdynaexpgridview" v-model="split" mode="horizontal">
<div slot='left'>
<el-tree ref="tree" :data="wfStepModel" node-key="userTaskId" :highlight-current="true" :props="defaultProps" @node-click="handleNodeClick.apply(_self, arguments)"></el-tree>
</div>
<div slot="right">
<div class="content-container">
<view_searchform
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:showBusyIndicator="true"
v-show="isExpandSearchForm"
loaddraftAction="FilterGetDraft"
loadAction="FilterGet"
name="searchform"
ref='searchform'
@save="searchform_save($event)"
@search="searchform_search($event)"
@load="searchform_load($event)"
@closeview="closeView($event)">
</view_searchform>
<view_grid
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:isSingleSelect="isGridSingleSelect"
:showBusyIndicator="true"
updateAction=""
removeAction="Remove"
loaddraftAction=""
loadAction=""
createAction=""
fetchAction="FetchDefault"
:newdata="newdata.bind(_self)"
:opendata="opendata.bind(_self)"
name="grid"
ref='grid'
@selectionchange="grid_selectionchange($event)"
@beforeload="grid_beforeload($event)"
@rowdblclick="grid_rowdblclick($event)"
@remove="grid_remove($event)"
@load="grid_load($event)"
@closeview="closeView($event)">
</view_grid>
</div>
</div>
</split>
</studio-view-style2>
\ No newline at end of file
......@@ -4,6 +4,7 @@ import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { HRTransferApplyWFDynaExpGridViewBase } from './hrtransfer-apply-wfdyna-exp-grid-view-base';
import view_grid from '@widgets/hrtransfer-apply/main-grid/main-grid.vue';
import view_searchform from '@widgets/hrtransfer-apply/default-searchform/default-searchform.vue';
/**
* 调动申请工作流导航表格视图视图
......@@ -15,6 +16,7 @@ import view_grid from '@widgets/hrtransfer-apply/main-grid/main-grid.vue';
@Component({
components: {
view_grid,
view_searchform,
}
})
@VueLifeCycleProcessing()
......
......@@ -225,6 +225,26 @@ export default class HRArchivesServiceBase extends EntityService {
return res;
}
/**
* FetchActive接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof HRArchivesServiceBase
*/
public async FetchActive(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(context.hremployee && true){
let tempData:any = JSON.parse(JSON.stringify(data));
let res:any = Http.getInstance().get(`/hremployees/${context.hremployee}/hrarchives/fetchactive`,tempData,isloading);
return res;
}
let tempData:any = JSON.parse(JSON.stringify(data));
let res:any = Http.getInstance().get(`/hrarchives/fetchactive`,tempData,isloading);
return res;
}
/**
* FetchDefault接口方法
*
......
......@@ -19,6 +19,7 @@ import com.alibaba.fastjson.JSONObject;
public interface HRArchivesMapper extends BaseMapper<HRArchives>{
Page<HRArchives> searchActive(IPage page, @Param("srf") HRArchivesSearchContext context, @Param("ew") Wrapper<HRArchives> wrapper) ;
Page<HRArchives> searchDefault(IPage page, @Param("srf") HRArchivesSearchContext context, @Param("ew") Wrapper<HRArchives> wrapper) ;
Page<HRArchives> searchNonArchives(IPage page, @Param("srf") HRArchivesSearchContext context, @Param("ew") Wrapper<HRArchives> wrapper) ;
Page<HRArchives> searchNonEmployee(IPage page, @Param("srf") HRArchivesSearchContext context, @Param("ew") Wrapper<HRArchives> wrapper) ;
......
......@@ -36,6 +36,7 @@ public interface IHRArchivesService extends IService<HRArchives>{
boolean checkKey(HRArchives et) ;
boolean save(HRArchives et) ;
void saveBatch(List<HRArchives> list) ;
Page<HRArchives> searchActive(HRArchivesSearchContext context) ;
Page<HRArchives> searchDefault(HRArchivesSearchContext context) ;
Page<HRArchives> searchNonArchives(HRArchivesSearchContext context) ;
Page<HRArchives> searchNonEmployee(HRArchivesSearchContext context) ;
......
......@@ -174,6 +174,15 @@ public class HRArchivesServiceImpl extends ServiceImpl<HRArchivesMapper, HRArchi
}
/**
* 查询集合 有效档案
*/
@Override
public Page<HRArchives> searchActive(HRArchivesSearchContext context) {
com.baomidou.mybatisplus.extension.plugins.pagination.Page<HRArchives> pages=baseMapper.searchActive(context.getPages(),context,context.getSelectCond());
return new PageImpl<HRArchives>(pages.getRecords(), context.getPageable(), pages.getTotal());
}
/**
* 查询集合 DEFAULT
*/
......
......@@ -36,6 +36,15 @@
where hrorganizationid=#{organizationid}
</select>
<!--数据集合[Active]-->
<select id="searchActive" parameterType="cn.ibizlab.humanresource.core.humanresource.filter.HRArchivesSearchContext" resultMap="HRArchivesResultMap">
select t1.* from (
<include refid="Active" />
)t1
<where><if test="ew!=null and ew.sqlSegment!=null and !ew.emptyOfWhere">${ew.sqlSegment}</if></where>
<if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">${ew.sqlSegment}</if>
</select>
<!--数据集合[Default]-->
<select id="searchDefault" parameterType="cn.ibizlab.humanresource.core.humanresource.filter.HRArchivesSearchContext" resultMap="HRArchivesResultMap">
select t1.* from (
......@@ -63,6 +72,12 @@
<if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">${ew.sqlSegment}</if>
</select>
<!--数据查询[Active]-->
<sql id="Active" databaseId="mysql">
<![CDATA[ SELECT t1.`ACTIVEFLAG`, t1.`ARCHIVESCODE`, t1.`ARCHIVESPLACE`, t1.`ARCHIVESPLACETYPE`, t1.`ARCHIVESROOM`, t1.`ATTACHMENT`, t1.`BIRTHDAY`, t1.`BORROWSTATE`, t1.`CREATEDATE`, t1.`CREATEMAN`, t1.`DEGREE`, t11.`EMPLOYEECODE`, t11.`EMPSTATE`, t1.`HRARCHIVESID`, t1.`HRARCHIVESNAME`, t1.`HREMPLOYEEID`, t11.`EMPLOYEENAME` AS `HREMPLOYEENAME`, t1.`HRORGANIZATIONID`, t31.`ORGANIZATIONNAME` AS `HRORGANIZATIONNAME`, t1.`MEMO`, t11.`ORGANIZATIONID`, t21.`ORGANIZATIONNAME`, t1.`POLITICALTIME`, t1.`STARTWORKTIME`, t1.`UPDATEDATE`, t1.`UPDATEMAN` FROM `T_HRARCHIVES` t1 LEFT JOIN EMPLOYEE t11 ON t1.HREMPLOYEEID = t11.EMPLOYEEID LEFT JOIN ORGANIZATION t21 ON t11.ORGANIZATIONID = t21.ORGANIZATIONID LEFT JOIN ORGANIZATION t31 ON t1.HRORGANIZATIONID = t31.ORGANIZATIONID
WHERE ( t1.`ACTIVEFLAG` = 1 )
]]>
</sql>
<!--数据查询[Default]-->
<sql id="Default" databaseId="mysql">
<![CDATA[ SELECT t1.`ACTIVEFLAG`, t1.`ARCHIVESCODE`, t1.`ARCHIVESPLACE`, t1.`ARCHIVESPLACETYPE`, t1.`ARCHIVESROOM`, t1.`ATTACHMENT`, t1.`BIRTHDAY`, t1.`BORROWSTATE`, t1.`CREATEDATE`, t1.`CREATEMAN`, t1.`DEGREE`, t11.`EMPLOYEECODE`, t11.`EMPSTATE`, t1.`HRARCHIVESID`, t1.`HRARCHIVESNAME`, t1.`HREMPLOYEEID`, t11.`EMPLOYEENAME` AS `HREMPLOYEENAME`, t1.`HRORGANIZATIONID`, t31.`ORGANIZATIONNAME` AS `HRORGANIZATIONNAME`, t1.`MEMO`, t11.`ORGANIZATIONID`, t21.`ORGANIZATIONNAME`, t1.`POLITICALTIME`, t1.`STARTWORKTIME`, t1.`UPDATEDATE`, t1.`UPDATEMAN` FROM `T_HRARCHIVES` t1 LEFT JOIN EMPLOYEE t11 ON t1.HREMPLOYEEID = t11.EMPLOYEEID LEFT JOIN ORGANIZATION t21 ON t11.ORGANIZATIONID = t21.ORGANIZATIONID LEFT JOIN ORGANIZATION t31 ON t1.HRORGANIZATIONID = t31.ORGANIZATIONID
......
......@@ -255,7 +255,7 @@
"dename":"HRArchives",
"delogicname":"档案信息",
"sysmoudle":{"id":"HUMANRESOURCE","name":"人力"},
"dedataset":[{"id":"Default" , "name":"DEFAULT"},{"id":"NonArchives" , "name":"员工不在档"},{"id":"NonEmployee" , "name":"非员工在档"}],
"dedataset":[{"id":"Active" , "name":"有效档案"},{"id":"Default" , "name":"DEFAULT"},{"id":"NonArchives" , "name":"员工不在档"},{"id":"NonEmployee" , "name":"非员工在档"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"datascope":[{"id":"all","name":"全部数据"}, {"id":"createman","name":"创建人"}]
}
......
......@@ -139,6 +139,27 @@ public class HRArchivesResource {
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchActive-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "获取有效档案", tags = {"档案信息" } ,notes = "获取有效档案")
@RequestMapping(method= RequestMethod.GET , value="/hrarchives/fetchactive")
public ResponseEntity<List<HRArchivesDTO>> fetchActive(HRArchivesSearchContext context) {
Page<HRArchives> domains = hrarchivesService.searchActive(context) ;
List<HRArchivesDTO> list = hrarchivesMapping.toDto(domains.getContent());
return ResponseEntity.status(HttpStatus.OK)
.header("x-page", String.valueOf(context.getPageable().getPageNumber()))
.header("x-per-page", String.valueOf(context.getPageable().getPageSize()))
.header("x-total", String.valueOf(domains.getTotalElements()))
.body(list);
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchActive-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "查询有效档案", tags = {"档案信息" } ,notes = "查询有效档案")
@RequestMapping(method= RequestMethod.POST , value="/hrarchives/searchactive")
public ResponseEntity<Page<HRArchivesDTO>> searchActive(@RequestBody HRArchivesSearchContext context) {
Page<HRArchives> domains = hrarchivesService.searchActive(context) ;
return ResponseEntity.status(HttpStatus.OK)
.body(new PageImpl(hrarchivesMapping.toDto(domains.getContent()), context.getPageable(), domains.getTotalElements()));
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchDefault-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "获取DEFAULT", tags = {"档案信息" } ,notes = "获取DEFAULT")
@RequestMapping(method= RequestMethod.GET , value="/hrarchives/fetchdefault")
......@@ -312,6 +333,29 @@ public class HRArchivesResource {
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchActive-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "根据员工获取有效档案", tags = {"档案信息" } ,notes = "根据员工获取有效档案")
@RequestMapping(method= RequestMethod.GET , value="/hremployees/{hremployee_id}/hrarchives/fetchactive")
public ResponseEntity<List<HRArchivesDTO>> fetchHRArchivesActiveByHREmployee(@PathVariable("hremployee_id") String hremployee_id,HRArchivesSearchContext context) {
context.setN_hremployeeid_eq(hremployee_id);
Page<HRArchives> domains = hrarchivesService.searchActive(context) ;
List<HRArchivesDTO> list = hrarchivesMapping.toDto(domains.getContent());
return ResponseEntity.status(HttpStatus.OK)
.header("x-page", String.valueOf(context.getPageable().getPageNumber()))
.header("x-per-page", String.valueOf(context.getPageable().getPageSize()))
.header("x-total", String.valueOf(domains.getTotalElements()))
.body(list);
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchActive-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "根据员工查询有效档案", tags = {"档案信息" } ,notes = "根据员工查询有效档案")
@RequestMapping(method= RequestMethod.POST , value="/hremployees/{hremployee_id}/hrarchives/searchactive")
public ResponseEntity<Page<HRArchivesDTO>> searchHRArchivesActiveByHREmployee(@PathVariable("hremployee_id") String hremployee_id, @RequestBody HRArchivesSearchContext context) {
context.setN_hremployeeid_eq(hremployee_id);
Page<HRArchives> domains = hrarchivesService.searchActive(context) ;
return ResponseEntity.status(HttpStatus.OK)
.body(new PageImpl(hrarchivesMapping.toDto(domains.getContent()), context.getPageable(), domains.getTotalElements()));
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','iBizHumanResources-HRArchives-searchDefault-all') and hasPermission(#context,'iBizHumanResources-HRArchives-Get')")
@ApiOperation(value = "根据员工获取DEFAULT", tags = {"档案信息" } ,notes = "根据员工获取DEFAULT")
@RequestMapping(method= RequestMethod.GET , value="/hremployees/{hremployee_id}/hrarchives/fetchdefault")
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册