浏览代码

会议扫码签到

master
zhichao lei 3 年前
父节点
当前提交
6029feaa79
共有 28 个文件被更改,包括 1926 次插入137 次删除
  1. +124
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Controllers/MeetingMinutesController.cs
  2. +23
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Form.cshtml
  3. +52
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Form.js
  4. +41
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Index.cshtml
  5. +94
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Index.js
  6. +5
    -0
      Learun.Framework.Ultimate V7/Learun.Application.Web/Learun.Application.Web.csproj
  7. +1
    -0
      Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj
  8. +116
    -0
      Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/PersonnelManagement/MeetingMinutesApi.cs
  9. +19
    -0
      Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/PersonnelManagement/MeetingSignInRecordApi.cs
  10. +1
    -1
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Base/CodeGeneratorModule/CodeGeneratorWx.cs
  11. +1
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Mapping/Learun.Application.Mapping.csproj
  12. +29
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Mapping/PersonnelManagement/MeetingMinutesMap.cs
  13. +4
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/Learun.Application.TwoDevelopment.csproj
  14. +149
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesBLL.cs
  15. +79
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesEntity.cs
  16. +56
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesIBLL.cs
  17. +212
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesService.cs
  18. +19
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordBLL.cs
  19. +1
    -0
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordIBLL.cs
  20. +32
    -2
      Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordService.cs
  21. +7
    -4
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/config.js
  22. +32
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json
  23. +186
    -128
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingManagement/list.vue
  24. +338
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingMinutes/list.vue
  25. +259
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingMinutes/single.vue
  26. +1
    -1
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingSignInRecord/list.vue
  27. +45
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingSignInScan/list.vue
  28. +0
    -1
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/WelcomNewStudents/ConfirmStudentsCheckIn/list.vue

+ 124
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Controllers/MeetingMinutesController.cs 查看文件

@@ -0,0 +1,124 @@
using Learun.Util;
using System.Data;
using Learun.Application.TwoDevelopment.PersonnelManagement;
using System.Web.Mvc;
using System.Collections.Generic;

namespace Learun.Application.Web.Areas.PersonnelManagement.Controllers
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesController : MvcControllerBase
{
private MeetingMinutesIBLL meetingMinutesIBLL = new MeetingMinutesBLL();

#region 视图功能

/// <summary>
/// 主页面
/// <summary>
/// <returns></returns>
[HttpGet]
public ActionResult Index()
{
return View();
}
/// <summary>
/// 表单页
/// <summary>
/// <returns></returns>
[HttpGet]
public ActionResult Form()
{
return View();
}
#endregion

#region 获取数据

/// <summary>
/// 获取页面显示列表分页数据
/// <summary>
/// <param name="pagination">分页参数</param>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
[HttpGet]
[AjaxOnly]
public ActionResult GetPageList(string pagination, string queryJson)
{
Pagination paginationobj = pagination.ToObject<Pagination>();
var data = meetingMinutesIBLL.GetPageList(paginationobj, queryJson);
var jsonData = new
{
rows = data,
total = paginationobj.total,
page = paginationobj.page,
records = paginationobj.records
};
return Success(jsonData);
}
/// <summary>
/// 获取页面显示列表数据
/// <summary>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
[HttpGet]
[AjaxOnly]
public ActionResult GetList(string queryJson)
{
var data = meetingMinutesIBLL.GetList(queryJson);
return Success(data);
}
/// <summary>
/// 获取表单数据
/// <summary>
/// <returns></returns>
[HttpGet]
[AjaxOnly]
public ActionResult GetFormData(string keyValue)
{
var MeetingMinutesData = meetingMinutesIBLL.GetMeetingMinutesEntity( keyValue );
var jsonData = new {
MeetingMinutes = MeetingMinutesData,
};
return Success(jsonData);
}
#endregion

#region 提交数据

/// <summary>
/// 删除实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
[HttpPost]
[AjaxOnly]
public ActionResult DeleteForm(string keyValue)
{
meetingMinutesIBLL.DeleteEntity(keyValue);
return Success("删除成功!");
}
/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
[AjaxOnly]
public ActionResult SaveForm(string keyValue, string strEntity)
{
UserInfo userInfo = LoginUserInfo.Get(); MeetingMinutesEntity entity = strEntity.ToObject<MeetingMinutesEntity>();
meetingMinutesIBLL.SaveEntity(userInfo,keyValue,entity);
return Success("保存成功!");
}
#endregion

}
}

+ 23
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Form.cshtml 查看文件

@@ -0,0 +1,23 @@
@{
ViewBag.Title = "会议纪要";
Layout = "~/Views/Shared/_Form.cshtml";
}
<div class="lr-form-wrap">
<div class="col-xs-12 lr-form-item" data-table="MeetingMinutes" >
<div class="lr-form-item-title">会议名称</div>
<input id="MeetID" type="text" class="form-control" />
</div>
<div class="col-xs-12 lr-form-item" data-table="MeetingMinutes" >
<div class="lr-form-item-title">纪要标题</div>
<input id="Title" type="text" class="form-control" />
</div>
<div class="col-xs-12 lr-form-item" data-table="MeetingMinutes" >
<div class="lr-form-item-title">内容</div>
<div id="Content" style="height:200px;"></div>
</div>
<div class="col-xs-12 lr-form-item" data-table="MeetingMinutes" >
<div class="lr-form-item-title">附件上传</div>
<div id="Files" ></div>
</div>
</div>
@Html.AppendJsFile("/Areas/PersonnelManagement/Views/MeetingMinutes/Form.js")

+ 52
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Form.js 查看文件

@@ -0,0 +1,52 @@
/* * 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架(http://www.learun.cn)
* Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
* 创建人:超级管理员
* 日 期:2021-03-08 10:36
* 描 述:会议纪要
*/
var acceptClick;
var keyValue = request('keyValue');
var bootstrap = function ($, learun) {
"use strict";
var page = {
init: function () {
$('.lr-form-wrap').lrscroll();
page.bind();
page.initData();
},
bind: function () {
var ContentUE = UE.getEditor('Content');
$('#Content')[0].ue = ContentUE; $('#Files').lrUploader();
},
initData: function () {
if (!!keyValue) {
$.lrSetForm(top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/GetFormData?keyValue=' + keyValue, function (data) {
for (var id in data) {
if (!!data[id].length && data[id].length > 0) {
$('#' + id ).jfGridSet('refreshdata', data[id]);
}
else {
$('[data-table="' + id + '"]').lrSetFormData(data[id]);
}
}
});
}
}
};
// 保存数据
acceptClick = function (callBack) {
if (!$('body').lrValidform()) {
return false;
}
var postData = {
strEntity: JSON.stringify($('body').lrGetFormData())
};
$.lrSaveForm(top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/SaveForm?keyValue=' + keyValue, postData, function (res) {
// 保存成功后才回调
if (!!callBack) {
callBack();
}
});
};
page.init();
}

+ 41
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Index.cshtml 查看文件

@@ -0,0 +1,41 @@
@{
ViewBag.Title = "会议纪要";
Layout = "~/Views/Shared/_Index.cshtml";
}
<div class="lr-layout " >
<div class="lr-layout-center">
<div class="lr-layout-wrap lr-layout-wrap-notitle ">
<div class="lr-layout-tool">
<div class="lr-layout-tool-left">
<div class="lr-layout-tool-item">
<div id="multiple_condition_query">
<div class="lr-query-formcontent">
<div class="col-xs-12 lr-form-item">
<div class="lr-form-item-title">会议名称</div>
<input id="MeetID" type="text" class="form-control" />
</div>
<div class="col-xs-12 lr-form-item">
<div class="lr-form-item-title">纪要标题</div>
<input id="Title" type="text" class="form-control" />
</div>
</div>
</div>
</div>
</div>
<div class="lr-layout-tool-right">
<div class=" btn-group btn-group-sm">
<a id="lr_refresh" class="btn btn-default"><i class="fa fa-refresh"></i></a>
</div>
<div class=" btn-group btn-group-sm" learun-authorize="yes">
<a id="lr_add" class="btn btn-default"><i class="fa fa-plus"></i>&nbsp;新增</a>
<a id="lr_edit" class="btn btn-default"><i class="fa fa-pencil-square-o"></i>&nbsp;编辑</a>
<a id="lr_delete" class="btn btn-default"><i class="fa fa-trash-o"></i>&nbsp;删除</a>
<a id="lr_print" class="btn btn-default"><i class="fa fa-print"></i>&nbsp;打印</a>
</div>
</div>
</div>
<div class="lr-layout-body" id="gridtable"></div>
</div>
</div>
</div>
@Html.AppendJsFile("/Areas/PersonnelManagement/Views/MeetingMinutes/Index.js")

+ 94
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/PersonnelManagement/Views/MeetingMinutes/Index.js 查看文件

@@ -0,0 +1,94 @@
/* * 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架(http://www.learun.cn)
* Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
* 创建人:超级管理员
* 日 期:2021-03-08 10:36
* 描 述:会议纪要
*/
var refreshGirdData;
var bootstrap = function ($, learun) {
"use strict";
var page = {
init: function () {
page.initGird();
page.bind();
},
bind: function () {
$('#multiple_condition_query').lrMultipleQuery(function (queryJson) {
page.search(queryJson);
}, 220, 400);
// 刷新
$('#lr_refresh').on('click', function () {
location.reload();
});
// 新增
$('#lr_add').on('click', function () {
learun.layerForm({
id: 'form',
title: '新增',
url: top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/Form',
width: 600,
height: 400,
callBack: function (id) {
return top[id].acceptClick(refreshGirdData);
}
});
});
// 编辑
$('#lr_edit').on('click', function () {
var keyValue = $('#gridtable').jfGridValue('ID');
if (learun.checkrow(keyValue)) {
learun.layerForm({
id: 'form',
title: '编辑',
url: top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/Form?keyValue=' + keyValue,
width: 600,
height: 400,
callBack: function (id) {
return top[id].acceptClick(refreshGirdData);
}
});
}
});
// 删除
$('#lr_delete').on('click', function () {
var keyValue = $('#gridtable').jfGridValue('ID');
if (learun.checkrow(keyValue)) {
learun.layerConfirm('是否确认删除该项!', function (res) {
if (res) {
learun.deleteForm(top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/DeleteForm', { keyValue: keyValue}, function () {
refreshGirdData();
});
}
});
}
});
// 打印
$('#lr_print').on('click', function () {
$('#gridtable').jqprintTable();
});
},
// 初始化列表
initGird: function () {
$('#gridtable').lrAuthorizeJfGrid({
url: top.$.rootUrl + '/PersonnelManagement/MeetingMinutes/GetPageList',
headData: [
{ label: "会议名称", name: "MeetID", width: 100, align: "left"},
{ label: "纪要标题", name: "Title", width: 100, align: "left"},
{ label: "内容", name: "Content", width: 100, align: "left"},
{ label: "附件上传", name: "Files", width: 100, align: "left"},
],
mainId:'ID',
isPage: true
});
page.search();
},
search: function (param) {
param = param || {};
$('#gridtable').jfGridSet('reload',{ queryJson: JSON.stringify(param) });
}
};
refreshGirdData = function () {
$('#gridtable').jfGridSet('reload');
};
page.init();
}

+ 5
- 0
Learun.Framework.Ultimate V7/Learun.Application.Web/Learun.Application.Web.csproj 查看文件

@@ -794,6 +794,7 @@
<Compile Include="Areas\EducationalAdministration\Controllers\EATalentTrainController.cs" />
<Compile Include="Areas\EducationalAdministration\Controllers\Sys_DefaultPwdConfigController.cs" />
<Compile Include="Areas\PersonnelManagement\Controllers\MeetingSignInRecordController.cs" />
<Compile Include="Areas\PersonnelManagement\Controllers\MeetingMinutesController.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Areas\AdmissionsPlatform\Views\AP_OnlineUserInfo\DropOutIndex.js" />
@@ -6136,6 +6137,10 @@
<Content Include="Areas\PersonnelManagement\Views\MeetingSignInRecord\Index.js" />
<Content Include="Areas\PersonnelManagement\Views\MeetingSignInRecord\Form.cshtml" />
<Content Include="Areas\PersonnelManagement\Views\MeetingSignInRecord\Form.js" />
<Content Include="Areas\PersonnelManagement\Views\MeetingMinutes\Index.cshtml" />
<Content Include="Areas\PersonnelManagement\Views\MeetingMinutes\Index.js" />
<Content Include="Areas\PersonnelManagement\Views\MeetingMinutes\Form.cshtml" />
<Content Include="Areas\PersonnelManagement\Views\MeetingMinutes\Form.js" />
</ItemGroup>
<ItemGroup>
<Folder Include="Areas\LR_Desktop\Models\" />


+ 1
- 0
Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj 查看文件

@@ -274,6 +274,7 @@
<Compile Include="Modules\LogisticsManagement\ADR_RecordApi.cs" />
<Compile Include="Modules\PersonnelManagement\MeetingManagementApi.cs" />
<Compile Include="Modules\PersonnelManagement\MeetingSignInRecordApi.cs" />
<Compile Include="Modules\PersonnelManagement\MeetingMinutesApi.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Learun.Application.Organization\Learun.Application.Organization.csproj">


+ 116
- 0
Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/PersonnelManagement/MeetingMinutesApi.cs 查看文件

@@ -0,0 +1,116 @@
using Nancy;
using Learun.Util;
using System.Collections.Generic;
using Learun.Application.TwoDevelopment.PersonnelManagement;
namespace Learun.Application.WebApi
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesApi : BaseApi
{
private MeetingMinutesIBLL meetingMinutesIBLL = new MeetingMinutesBLL();

/// <summary>
/// 注册接口
/// <summary>
public MeetingMinutesApi()
: base("/Learun/adms/PersonnelManagement/MeetingMinutes")
{
Get["/pagelist"] = GetPageList;
Get["/list"] = GetList;
Get["/form"] = GetForm;
Post["/delete"] = DeleteForm;
Post["/save"] = SaveForm;
}
#region 获取数据

/// <summary>
/// 获取页面显示列表分页数据
/// <summary>
/// <param name="_"></param>
/// <returns></returns>
public Response GetPageList(dynamic _)
{
ReqPageParam parameter = this.GetReqData<ReqPageParam>();
var data = meetingMinutesIBLL.GetPageList(parameter.pagination, parameter.queryJson);
var jsonData = new
{
rows = data,
total = parameter.pagination.total,
page = parameter.pagination.page,
records = parameter.pagination.records
};
return Success(jsonData);
}
/// <summary>
/// 获取页面显示列表数据
/// <summary>
/// <param name="_"></param>
/// <returns></returns>
public Response GetList(dynamic _)
{
string queryJson = this.GetReqData();
var data = meetingMinutesIBLL.GetList(queryJson);
return Success(data);
}
/// <summary>
/// 获取表单数据
/// <summary>
/// <param name="_"></param>
/// <returns></returns>
public Response GetForm(dynamic _)
{
string keyValue = this.GetReqData();
var MeetingMinutesData = meetingMinutesIBLL.GetMeetingMinutesEntity( keyValue );
var jsonData = new {
MeetingMinutes = MeetingMinutesData,
};
return Success(jsonData);
}
#endregion

#region 提交数据

/// <summary>
/// 删除实体数据
/// <param name="_"></param>
/// <summary>
/// <returns></returns>
public Response DeleteForm(dynamic _)
{
string keyValue = this.GetReqData();
meetingMinutesIBLL.DeleteEntity(keyValue);
return Success("删除成功!");
}
/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="_"></param>
/// <summary>
/// <returns></returns>
public Response SaveForm(dynamic _)
{
ReqFormEntity parameter = this.GetReqData<ReqFormEntity>();
MeetingMinutesEntity entity = parameter.strEntity.ToObject<MeetingMinutesEntity>();
meetingMinutesIBLL.SaveEntity(this.userInfo,parameter.keyValue,entity);
return Success("保存成功!");
}
#endregion

#region 私有类

/// <summary>
/// 表单实体类
/// <summary>
private class ReqFormEntity {
public string keyValue { get; set; }
public string strEntity{ get; set; }
}
#endregion

}
}

+ 19
- 0
Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/PersonnelManagement/MeetingSignInRecordApi.cs 查看文件

@@ -26,6 +26,7 @@ namespace Learun.Application.WebApi
Get["/form"] = GetForm;
Post["/delete"] = DeleteForm;
Post["/save"] = SaveForm;
Get["/scan"] = Scan;
}
#region 获取数据

@@ -86,6 +87,18 @@ namespace Learun.Application.WebApi
string keyValue = this.GetReqData();
meetingSignInRecordIBLL.DeleteEntity(keyValue);
return Success("删除成功!");
}
/// <summary>
/// 会议扫码签到
/// <param name="_"></param>
/// <summary>
/// <returns></returns>
public Response Scan(dynamic _)
{
ScanParam scanParam = this.GetReqData<ScanParam>();
var result= meetingSignInRecordIBLL.Scan(scanParam.userid,scanParam.meetid)?"签到成功":"签到失败";
return Success(new {result});
}
/// <summary>
/// 保存实体数据(新增、修改)
@@ -110,6 +123,12 @@ namespace Learun.Application.WebApi
public string keyValue { get; set; }
public string strEntity{ get; set; }
}

private class ScanParam
{
public string userid { get; set; }
public string meetid { get; set; }
}
#endregion

}


+ 1
- 1
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Base/CodeGeneratorModule/CodeGeneratorWx.cs 查看文件

@@ -2969,7 +2969,7 @@ namespace Learun.Application.Base.CodeGeneratorModule
sb.Append(" /// 注册接口\r\n");
sb.Append(" /// <summary>\r\n");
sb.Append(" public " + baseInfo.name + "Api()\r\n");
sb.Append(" : base(\"/learun/adms/" + baseInfo.outputArea + "/" + baseInfo.name + "\")\r\n");
sb.Append(" : base(\"/" + baseInfo.outputArea + "/" + baseInfo.name + "\")\r\n");
sb.Append(" {\r\n");
sb.Append(" Get[\"/pagelist\"] = GetPageList;\r\n");
sb.Append(" Get[\"/list\"] = GetList;\r\n");


+ 1
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Mapping/Learun.Application.Mapping.csproj 查看文件

@@ -546,6 +546,7 @@
<Compile Include="EducationalAdministration\EATalentTrainMap.cs" />
<Compile Include="EducationalAdministration\Sys_DefaultPwdConfigMap.cs" />
<Compile Include="PersonnelManagement\MeetingSignInRecordMap.cs" />
<Compile Include="PersonnelManagement\MeetingMinutesMap.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Learun.Application.Organization\Learun.Application.Organization.csproj">


+ 29
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Mapping/PersonnelManagement/MeetingMinutesMap.cs 查看文件

@@ -0,0 +1,29 @@
using Learun.Application.TwoDevelopment.PersonnelManagement;
using System.Data.Entity.ModelConfiguration;

namespace Learun.Application.Mapping
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesMap : EntityTypeConfiguration<MeetingMinutesEntity>
{
public MeetingMinutesMap()
{
#region 表、主键
//表
this.ToTable("MEETINGMINUTES");
//主键
this.HasKey(t => t.ID);
#endregion

#region 配置关系
#endregion
}
}
}


+ 4
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/Learun.Application.TwoDevelopment.csproj 查看文件

@@ -1605,6 +1605,10 @@
<Compile Include="PersonnelManagement\MeetingSignInRecord\MeetingSignInRecordService.cs" />
<Compile Include="PersonnelManagement\MeetingSignInRecord\MeetingSignInRecordBLL.cs" />
<Compile Include="PersonnelManagement\MeetingSignInRecord\MeetingSignInRecordIBLL.cs" />
<Compile Include="PersonnelManagement\MeetingMinutes\MeetingMinutesEntity.cs" />
<Compile Include="PersonnelManagement\MeetingMinutes\MeetingMinutesService.cs" />
<Compile Include="PersonnelManagement\MeetingMinutes\MeetingMinutesBLL.cs" />
<Compile Include="PersonnelManagement\MeetingMinutes\MeetingMinutesIBLL.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Learun.Application.Organization\Learun.Application.Organization.csproj">


+ 149
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesBLL.cs 查看文件

@@ -0,0 +1,149 @@
using Learun.Util;
using System;
using System.Data;
using System.Collections.Generic;

namespace Learun.Application.TwoDevelopment.PersonnelManagement
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesBLL : MeetingMinutesIBLL
{
private MeetingMinutesService meetingMinutesService = new MeetingMinutesService();

#region 获取数据

/// <summary>
/// 获取页面显示列表分页数据
/// <summary>
/// <param name="pagination">分页参数</param>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
public IEnumerable<MeetingMinutesEntity> GetPageList(Pagination pagination, string queryJson)
{
try
{
return meetingMinutesService.GetPageList(pagination, queryJson);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

/// <summary>
/// 获取页面显示列表数据
/// <summary>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
public IEnumerable<MeetingMinutesEntity> GetList(string queryJson)
{
try
{
return meetingMinutesService.GetList(queryJson);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

/// <summary>
/// 获取MeetingMinutes表实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public MeetingMinutesEntity GetMeetingMinutesEntity(string keyValue)
{
try
{
return meetingMinutesService.GetMeetingMinutesEntity(keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

#endregion

#region 提交数据

/// <summary>
/// 删除实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public void DeleteEntity(string keyValue)
{
try
{
meetingMinutesService.DeleteEntity(keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public void SaveEntity(UserInfo userInfo, string keyValue, MeetingMinutesEntity entity)
{
try
{
meetingMinutesService.SaveEntity(userInfo, keyValue, entity);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

#endregion

}
}

+ 79
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesEntity.cs 查看文件

@@ -0,0 +1,79 @@
using Learun.Util;
using System;
using System.ComponentModel.DataAnnotations.Schema;

namespace Learun.Application.TwoDevelopment.PersonnelManagement
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesEntity
{
#region 实体成员
/// <summary>
/// 编号
/// </summary>
[Column("ID")]
public string ID { get; set; }
/// <summary>
/// 会议id
/// </summary>
[Column("MEETID")]
public string MeetID { get; set; }
/// <summary>
/// 纪要标题
/// </summary>
[Column("TITLE")]
public string Title { get; set; }
/// <summary>
/// 纪要内容
/// </summary>
[Column("CONTENT")]
public string Content { get; set; }
/// <summary>
/// 附件
/// </summary>
[Column("FILES")]
public string Files { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Column("CREATETIME")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
[Column("CREATEUSER")]
public string CreateUser { get; set; }

#endregion

#region 扩展操作
/// <summary>
/// 新增调用
/// </summary>
public void Create(UserInfo userInfo)
{
this.ID = Guid.NewGuid().ToString();
}
/// <summary>
/// 编辑调用
/// </summary>
/// <param name="keyValue"></param>
public void Modify(string keyValue, UserInfo userInfo)
{
this.ID = keyValue;
}
#endregion
#region 扩展字段
[NotMapped]
[Column("MEETINGTITLE")]
public string MeetingTitle { get; set; }
#endregion
}
}


+ 56
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesIBLL.cs 查看文件

@@ -0,0 +1,56 @@
using Learun.Util;
using System.Data;
using System.Collections.Generic;

namespace Learun.Application.TwoDevelopment.PersonnelManagement
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public interface MeetingMinutesIBLL
{
#region 获取数据

/// <summary>
/// 获取页面显示列表分页数据
/// <summary>
/// <param name="pagination">查询参数</param>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
IEnumerable<MeetingMinutesEntity> GetPageList(Pagination pagination, string queryJson);
/// <summary>
/// 获取页面显示列表数据
/// <summary>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
IEnumerable<MeetingMinutesEntity> GetList(string queryJson);
/// <summary>
/// 获取MeetingMinutes表实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
MeetingMinutesEntity GetMeetingMinutesEntity(string keyValue);
#endregion

#region 提交数据

/// <summary>
/// 删除实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
void DeleteEntity(string keyValue);
/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
void SaveEntity(UserInfo userInfo, string keyValue, MeetingMinutesEntity entity);
#endregion

}
}

+ 212
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingMinutes/MeetingMinutesService.cs 查看文件

@@ -0,0 +1,212 @@
using Dapper;
using Learun.DataBase.Repository;
using Learun.Util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

namespace Learun.Application.TwoDevelopment.PersonnelManagement
{
/// <summary>
/// 版 本 Learun-ADMS V7.0.6 力软敏捷开发框架
/// Copyright (c) 2013-2020 力软信息技术(苏州)有限公司
/// 创 建:超级管理员
/// 日 期:2021-03-08 10:36
/// 描 述:会议纪要
/// </summary>
public class MeetingMinutesService : RepositoryFactory
{
#region 获取数据

/// <summary>
/// 获取页面显示列表分页数据
/// <summary>
/// <param name="pagination">分页参数</param>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
public IEnumerable<MeetingMinutesEntity> GetPageList(Pagination pagination, string queryJson)
{
try
{
var strSql = new StringBuilder();
strSql.Append("SELECT ");
strSql.Append(@"
t.ID,
t.MeetID,
t.Title,
t.Content,
t.Files,m.MeetingTitle
");
strSql.Append(" FROM MeetingMinutes t left join MeetingManagement m on t.MeetID=m.Id ");
strSql.Append(" WHERE 1=1 ");
var queryParam = queryJson.ToJObject();
// 虚拟参数
var dp = new DynamicParameters(new { });
if (!queryParam["MeetID"].IsEmpty())
{
dp.Add("MeetID", queryParam["MeetID"].ToString(), DbType.String);
strSql.Append(" AND t.MeetID = @MeetID ");
}
if (!queryParam["MeetingTitle"].IsEmpty())
{
dp.Add("MeetingTitle", "%" + queryParam["MeetingTitle"].ToString() + "%", DbType.String);
strSql.Append(" AND m.MeetingTitle Like @MeetingTitle ");
}
if (!queryParam["Title"].IsEmpty())
{
dp.Add("Title", "%" + queryParam["Title"].ToString() + "%", DbType.String);
strSql.Append(" AND t.Title Like @Title ");
}
return this.BaseRepository("CollegeMIS").FindList<MeetingMinutesEntity>(strSql.ToString(),dp, pagination);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}

/// <summary>
/// 获取页面显示列表数据
/// <summary>
/// <param name="queryJson">查询参数</param>
/// <returns></returns>
public IEnumerable<MeetingMinutesEntity> GetList(string queryJson)
{
try
{
var strSql = new StringBuilder();
strSql.Append("SELECT ");
strSql.Append(@"
t.ID,
t.MeetID,
t.Title,
t.Content,
t.Files
");
strSql.Append(" FROM MeetingMinutes t ");
strSql.Append(" WHERE 1=1 ");
var queryParam = queryJson.ToJObject();
// 虚拟参数
var dp = new DynamicParameters(new { });
if (!queryParam["MeetID"].IsEmpty())
{
dp.Add("MeetID", "%" + queryParam["MeetID"].ToString() + "%", DbType.String);
strSql.Append(" AND t.MeetID Like @MeetID ");
}
if (!queryParam["Title"].IsEmpty())
{
dp.Add("Title", "%" + queryParam["Title"].ToString() + "%", DbType.String);
strSql.Append(" AND t.Title Like @Title ");
}
return this.BaseRepository("CollegeMIS").FindList<MeetingMinutesEntity>(strSql.ToString(),dp);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}

/// <summary>
/// 获取MeetingMinutes表实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public MeetingMinutesEntity GetMeetingMinutesEntity(string keyValue)
{
try
{
return this.BaseRepository("CollegeMIS").FindEntity<MeetingMinutesEntity>(keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}

#endregion

#region 提交数据

/// <summary>
/// 删除实体数据
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public void DeleteEntity(string keyValue)
{
try
{
this.BaseRepository("CollegeMIS").Delete<MeetingMinutesEntity>(t=>t.ID == keyValue);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}

/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="keyValue">主键</param>
/// <summary>
/// <returns></returns>
public void SaveEntity( UserInfo userInfo, string keyValue, MeetingMinutesEntity entity)
{
try
{
if (!string.IsNullOrEmpty(keyValue))
{
entity.Modify(keyValue,userInfo);
this.BaseRepository("CollegeMIS").Update(entity);
}
else
{
entity.Create(userInfo);
this.BaseRepository("CollegeMIS").Insert(entity);
}
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}

#endregion

}
}

+ 19
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordBLL.cs 查看文件

@@ -167,6 +167,25 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement
}
}

public bool Scan(string scanParamUserid, string scanParamMeetid)
{
try
{
return meetingSignInRecordService.Scan(scanParamUserid, scanParamMeetid);
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}

#endregion

}


+ 1
- 0
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordIBLL.cs 查看文件

@@ -59,5 +59,6 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement
void DoSignIn(string keyValue, bool isSignIn);
#endregion

bool Scan(string scanParamUserid, string scanParamMeetid);
}
}

+ 32
- 2
Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/MeetingSignInRecord/MeetingSignInRecordService.cs 查看文件

@@ -72,8 +72,8 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement
try
{
var strSql = new StringBuilder();
strSql.Append("SELECT t.* ");
strSql.Append(" FROM MeetingSignInRecord t ");
strSql.Append("SELECT t.*,m.MeetingTitle ");
strSql.Append(" FROM MeetingSignInRecord t left join MeetingManagement m on t.MeetID=m.Id ");
strSql.Append(" WHERE 1=1 ");
var queryParam = queryJson.ToJObject();
// 虚拟参数
@@ -211,5 +211,35 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement

#endregion

public bool Scan(string scanParamUserid, string scanParamMeetid)
{
try
{
var result = false;
var meetEntity = this.BaseRepository("CollegeMIS")
.FindEntity<MeetingSignInRecordEntity>(a =>
a.MeetID == scanParamMeetid && a.ParticipantID == scanParamUserid);
if (meetEntity != null)
{
meetEntity.IsSignIn = true;
this.BaseRepository("CollegeMIS").Update(meetEntity);
result = true;

}
return result;

}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowServiceException(ex);
}
}
}
}
}

+ 7
- 4
Learun.Framework.Ultimate V7/LearunApp-2.2.0/config.js 查看文件

@@ -6,14 +6,17 @@ export default {
// 是否允许用户注册
"enableSignUp": true,
//请求数据的接口地址;可以配置多个,开发环境下登录页会出现选择菜单供您选择
"apiHost": [
"http://123.57.209.16:31173/"
],
// "apiHost": [
// "http://123.57.209.16:31173/"
// ],
// "apiHost": [
// "http://123.57.209.16:31174/learun/adms"
// ],
// "apiHost": [
// "http://localhost:8088/"
// ],
"apiHost": [
"http://localhost:8088/"
"http://192.168.2.98:8088/"
],
// 开发环境下自动填充登录账号密码,与接口地址一一对应,只在开发环境下显示
"devAccount": [


+ 32
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json 查看文件

@@ -954,6 +954,38 @@
"style": {
"navigationBarTitleText": "详情"
}
},
//会议纪要
{
"path": "pages/PersonnelManagement/MeetingMinutes/list",
"style": {
"navigationBarTitleText": "会议纪要"
}
},
{
"path": "pages/PersonnelManagement/MeetingMinutes/single",
"style": {
"navigationBarTitleText": "详情"
}
},
//会议签到记录
{
"path": "pages/PersonnelManagement/MeetingSignInRecord/list",
"style": {
"navigationBarTitleText": "会议签到记录"
}
},
{
"path": "pages/PersonnelManagement/MeetingSignInRecord/single",
"style": {
"navigationBarTitleText": "详情"
}
},
{
"path": "pages/PersonnelManagement/MeetingSignInScan/list",
"style": {
"navigationBarTitleText": "会议扫码签到"
}
}



+ 186
- 128
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingManagement/list.vue 查看文件

@@ -1,102 +1,124 @@
<template>
<view class="page">
<!-- 主列表页 -->
<view :class="sideOpen ? 'show' : ''" class="mainpage" style="padding-top: 80rpx;">
<view
:class="sideOpen ? 'show' : ''"
class="mainpage"
style="padding-top: 80rpx"
>
<!-- 顶部条目/分页信息栏 -->
<l-customlist-banner @buttonClick="sideOpen = true">{{ tips }}</l-customlist-banner>
<l-customlist-banner @buttonClick="sideOpen = true">{{
tips
}}</l-customlist-banner>

<!-- 滚动列表,跨端支持上拉/下拉 -->
<l-scroll-list v-if="ready" @pullDown="pullDown" @toBottom="fetchList()" ref="list">
<l-scroll-list
v-if="ready"
@pullDown="pullDown"
@toBottom="fetchList()"
ref="list"
>
<l-customlist :tips="loadState" showTips>
<!-- 单条记录 -->
<view class="customlist-item" v-for="item of list" :key="item.Id">

<view class="customlist-item-field">
<text class="customlist-item-field-title">会议主题:</text>
{{ displayListItem(item, 'MeetingTitle') }}
{{ displayListItem(item, "MeetingTitle") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">会议地点:</text>
{{ displayListItem(item, 'MeetingPlace') }}
{{ displayListItem(item, "MeetingPlace") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">开始时间:</text>
{{ displayListItem(item, 'BeginTime') }}
{{ displayListItem(item, "BeginTime") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">结束时间:</text>
{{ displayListItem(item, 'EndTime') }}
{{ displayListItem(item, "EndTime") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">申请人:</text>
{{ displayListItem(item, 'CreateUser') }}
{{ displayListItem(item, "CreateUser") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">会议记录者:</text>
{{ displayListItem(item, 'RecordPerson') }}
{{ displayListItem(item, "RecordPerson") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">会议内容:</text>
{{ displayListItem(item, 'Content') }}
{{ displayListItem(item, "Content") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">附件上传:</text>
{{ displayListItem(item, 'Files') }}
{{ displayListItem(item, "Files") }}
</view>


<l-customlist-action showEdit @edit="action('edit', item.Id)" showDelete @delete="action('delete', item.Id)" @view="action('view', item.Id)" />
<l-customlist-action
showButton
buttonText="会议纪要"
@join="action('join', item.Id)"
showEdit
@edit="action('edit', item.Id)"
showDelete
@delete="action('delete', item.Id)"
@view="action('view', item.Id)"
/>
</view>
</l-customlist>
</l-scroll-list>
</view>

<!-- 关闭侧边抽屉按钮 -->
<view @click="sideOpen = false" :class="sideOpen ? 'show' : ''" class="sideclose">
<view
@click="sideOpen = false"
:class="sideOpen ? 'show' : ''"
class="sideclose"
>
<l-icon type="pullright" color="blue" />
</view>

<!-- 侧边栏,用于设置查询条件 -->
<scroll-view :class="sideOpen ? 'show' : ''" class="sidepage" scroll-y>
<view v-if="ready" class="padding">

<l-input
v-model="queryData.MeetingTitle"
@change="searchChange"
title ="会议主题"
title="会议主题"
placeholder="按会议主题查询"
/>
<l-select
v-model="queryData.MeetingPlace"
@change="searchChange"
:range="dataSource.MeetingPlace"
title ="会议地点"
title="会议地点"
placeholder="按会议地点查询"
/>
<l-organize-picker
v-model="queryData.CreateUser"
@change="searchChange"
type="user"
title ="申请人"
title="申请人"
placeholder="按申请人查询"
/>

<!-- 重置查询条件按钮 -->
<view class="padding-tb">
<l-button @click="reset" line="orange" class="block" block>重置查询条件</l-button>
<l-button @click="reset" line="orange" class="block" block
>重置查询条件</l-button
>
</view>
</view>
</scroll-view>

<l-customlist-add v-if="!sideOpen" @click="action('add')" />

</view>
</template>

@@ -114,38 +136,38 @@
* 本段代码由移动端代码生成器输出,移动端须 2.2.0 版本及以上可以使用
* 请在移动端 /pages.json 中的 pages 字段中添加一条记录:
* { "path": "pages/PersonnelManagement/MeetingManagement/list", "style": { "navigationBarTitleText": "表单列表页" } }
*
*
* (navigationBarTitleText 字段为本页面的标题文本,可以修改)
* (必须自行操作该步骤,力软代码生成器不会自动帮您修改 /pages.json 文件)
*/
import moment from 'moment'
import get from 'lodash/get'
import set from 'lodash/set'
import pickBy from 'lodash/pickBy'
import mapValues from 'lodash/mapValues'
import moment from "moment";
import get from "lodash/get";
import set from "lodash/set";
import pickBy from "lodash/pickBy";
import mapValues from "lodash/mapValues";

export default {
data() {
return {
// 数据项的数据类型、结构
scheme: {
MeetingTitle: { type: 'text' },
MeetingPlace: { type: 'select', dataSource: '0' },
BeginTime: { type: 'datetime', dateformat: '0' },
EndTime: { type: 'datetime', dateformat: '0' },
RecordPerson: { type: 'organize', dataType: 'user' },
Content: { type: 'texteditor' },
Files: { type: 'upload' },
CreateUser: { type: 'organize', dataType: 'user' },
MeetingTitle: { type: "text" },
MeetingPlace: { type: "select", dataSource: "0" },
BeginTime: { type: "datetime", dateformat: "0" },
EndTime: { type: "datetime", dateformat: "0" },
RecordPerson: { type: "organize", dataType: "user" },
Content: { type: "texteditor" },
Files: { type: "upload" },
CreateUser: { type: "organize", dataType: "user" },
},

// 查询条件
searchData: {},
defaultQueryData: {},
queryData: {
MeetingTitle: '',
MeetingPlace: '',
CreateUser: '',
MeetingTitle: "",
MeetingPlace: "",
CreateUser: "",
},

// 数据源
@@ -155,166 +177,202 @@ export default {

// 页面相关参数
ready: false,
tips: '加载中...',
loadState: '向下翻以加载更多',
tips: "加载中...",
loadState: "向下翻以加载更多",
sideOpen: false,

// 列表与分页信息
page: 1,
total: 2,
list: []
}
list: [],
};
},

async onLoad() {
await this.init()
await this.init();
},
onUnload() {
this.OFF('PersonnelManagementMeetingManagement-list-change')
this.OFF("PersonnelManagementMeetingManagement-list-change");
},

methods: {
// 页面初始化
async init() {
this.ON('PersonnelManagementMeetingManagement-list-change', this.refreshList)
this.ON(
"PersonnelManagementMeetingManagement-list-change",
this.refreshList
);

// 拉取加载列表和数据源
await Promise.all([


() => {}
])
await this.fetchList()
await Promise.all([() => {}]);
await this.fetchList();
// 初始化查询条件
this.defaultQueryData = this.COPY(this.queryData)
this.ready = true
this.defaultQueryData = this.COPY(this.queryData);
this.ready = true;
},

// 拉取列表
async fetchList() {
if (this.page > this.total) { return }
if (this.page > this.total) {
return;
}

const result = await this.HTTP_GET(
'learun/adms/PersonnelManagement/MeetingManagement/pagelist',
"learun/adms/PersonnelManagement/MeetingManagement/pagelist",
{
// 这里 sidx 表示排序字段,sord 表示排序方式(DESC=降序,ASC=升序)
// 代码生成器生成时默认按照主键排序,您可以修改成按创建时间的字段降序
pagination: { rows: 10, page: this.page, sidx: 'Id', sord: 'DESC' },
queryJson: JSON.stringify(this.searchData)
pagination: { rows: 10, page: this.page, sidx: "Id", sord: "DESC" },
queryJson: JSON.stringify(this.searchData),
},
'加载数据时出错'
)
"加载数据时出错"
);

if (!result) { return }
if (!result) {
return;
}

this.total = result.total
this.page = result.page + 1
this.list = this.list.concat(result.rows)
this.total = result.total;
this.page = result.page + 1;
this.list = this.list.concat(result.rows);

this.tips = `已加载 ${Math.min(result.page, result.total)} / ${result.total} 页,共 ${result.records} 项`
this.loadState = result.page >= result.total ? '已加载所有项目' : '向下翻以加载更多'
this.tips = `已加载 ${Math.min(result.page, result.total)} / ${
result.total
} 页,共 ${result.records} 项`;
this.loadState =
result.page >= result.total ? "已加载所有项目" : "向下翻以加载更多";
},

// 刷新清空列表
async refreshList() {
this.page = 1
this.total = 2
this.list = []
this.page = 1;
this.total = 2;
this.list = [];

await this.fetchList()
await this.fetchList();
},

// 列表下拉
pullDown() {
this.refreshList().then(() => {
this.$refs.list.stopPullDown()
})
this.$refs.list.stopPullDown();
});
},

// 设置搜索条件
async searchChange() {
const result = {}
const result = {};

// 将其他查询项添加到查询 JSON 中
const queryObj = pickBy(this.queryData, t => (Array.isArray(t) ? t.length > 0 : t))
Object.assign(result, mapValues(queryObj, t => (Array.isArray(t) ? t.join(',') : t)))

this.searchData = result
await this.refreshList()
const queryObj = pickBy(this.queryData, (t) =>
Array.isArray(t) ? t.length > 0 : t
);
Object.assign(
result,
mapValues(queryObj, (t) => (Array.isArray(t) ? t.join(",") : t))
);

this.searchData = result;
await this.refreshList();
},

// 点击「清空查询条件」按钮
reset() {
this.queryData = this.COPY(this.defaultQueryData)
this.searchChange()
this.queryData = this.COPY(this.defaultQueryData);
this.searchChange();
},

// 点击「编辑」、「查看」、「添加」、「删除」按钮
async action(type, id = '') {
async action(type, id = "") {
switch (type) {
case 'view':
this.NAV_TO(`./single?type=view&id=${id}`)
return

case 'add':
this.NAV_TO('./single?type=create')
return

case 'edit':
this.NAV_TO(`./single?type=edit&id=${id}`)
return

case 'delete':
if (!(await this.CONFIRM('删除项目', '确定要删除该项吗?', true))) {
return
case "view":
this.NAV_TO(`./single?type=view&id=${id}`);
return;

case "add":
this.NAV_TO("./single?type=create");
return;

case "edit":
this.NAV_TO(`./single?type=edit&id=${id}`);
return;
case "join":
console.log(123);
this.NAV_TO(`/pages/PersonnelManagement/MeetingMinutes/list?meetId=${id}`);
return;

case "delete":
if (!(await this.CONFIRM("删除项目", "确定要删除该项吗?", true))) {
return;
}

this.HTTP_POST('learun/adms/PersonnelManagement/MeetingManagement/delete', id, '删除失败').then(success => {
if(!success) { return }
this.TOAST('删除成功', 'success')
this.refreshList()
})
return
this.HTTP_POST(
"learun/adms/PersonnelManagement/MeetingManagement/delete",
id,
"删除失败"
).then((success) => {
if (!success) {
return;
}
this.TOAST("删除成功", "success");
this.refreshList();
});
return;

default:
return
return;
}
},

// 显示列表中的标题项
displayListItem(item, field) {
const fieldItem = this.scheme[field]
const value = item[field]
const fieldItem = this.scheme[field];
const value = item[field];

switch (fieldItem.type) {
case 'currentInfo':
case 'organize':
return fieldItem.dataType === 'time' ? value : get(this.GET_GLOBAL(fieldItem.dataType), `${value}.name`, '')

case 'radio':
case 'select':
const selectItem = this.dataSource[field].find(t => t.value === String(value))
return get(selectItem, 'text', '')

case 'checkbox':
if (!value || value.split(',').length <= 0) { return '' }
const checkboxItems = value.split(',')
return this.dataSource[field].filter(t => checkboxItems.includes(t.value)).map(t => t.text).join(',')

case 'datetime':
if (!value) { return '' }
return moment(value).format(Number(fieldItem.dateformat) === 0 ? 'YYYY年 M月 D日' : 'YYYY-MM-DD HH:mm')
case "currentInfo":
case "organize":
return fieldItem.dataType === "time"
? value
: get(this.GET_GLOBAL(fieldItem.dataType), `${value}.name`, "");

case "radio":
case "select":
const selectItem = this.dataSource[field].find(
(t) => t.value === String(value)
);
return get(selectItem, "text", "");

case "checkbox":
if (!value || value.split(",").length <= 0) {
return "";
}
const checkboxItems = value.split(",");
return this.dataSource[field]
.filter((t) => checkboxItems.includes(t.value))
.map((t) => t.text)
.join(",");

case "datetime":
if (!value) {
return "";
}
return moment(value).format(
Number(fieldItem.dateformat) === 0
? "YYYY年 M月 D日"
: "YYYY-MM-DD HH:mm"
);

default: return value === null || value === undefined ? '' : value
default:
return value === null || value === undefined ? "" : value;
}
}

}
}
},
},
};
</script>


<style lang="less" scoped>
@import '~@/common/css/sidepage.less';
@import '~@/common/css/customlist.less';
@import "~@/common/css/sidepage.less";
@import "~@/common/css/customlist.less";
</style>

+ 338
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingMinutes/list.vue 查看文件

@@ -0,0 +1,338 @@
<template>
<view class="page">
<!-- 主列表页 -->
<view
:class="sideOpen ? 'show' : ''"
class="mainpage"
style="padding-top: 80rpx"
>
<!-- 顶部条目/分页信息栏 -->
<l-customlist-banner @buttonClick="sideOpen = true">{{
tips
}}</l-customlist-banner>

<!-- 滚动列表,跨端支持上拉/下拉 -->
<l-scroll-list
v-if="ready"
@pullDown="pullDown"
@toBottom="fetchList()"
ref="list"
>
<l-customlist :tips="loadState" showTips>
<!-- 单条记录 -->
<view class="customlist-item" v-for="item of list" :key="item.ID">
<view class="customlist-item-field">
<text class="customlist-item-field-title">会议名称:</text>
{{ displayListItem(item, "MeetingTitle") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">纪要标题:</text>
{{ displayListItem(item, "Title") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">内容:</text>
{{ displayListItem(item, "Content") }}
</view>

<view class="customlist-item-field">
<text class="customlist-item-field-title">附件上传:</text>
{{ displayListItem(item, "Files") }}
</view>

<l-customlist-action
showEdit
@edit="action('edit', item.ID)"
showDelete
@delete="action('delete', item.ID)"
@view="action('view', item.ID)"
/>
</view>
</l-customlist>
</l-scroll-list>
</view>

<!-- 关闭侧边抽屉按钮 -->
<view
@click="sideOpen = false"
:class="sideOpen ? 'show' : ''"
class="sideclose"
>
<l-icon type="pullright" color="blue" />
</view>

<!-- 侧边栏,用于设置查询条件 -->
<scroll-view :class="sideOpen ? 'show' : ''" class="sidepage" scroll-y>
<view v-if="ready" class="padding">
<l-input
v-model="queryData.MeetID"
@change="searchChange"
title="会议名称"
placeholder="按会议名称查询"
/>
<l-input
v-model="queryData.Title"
@change="searchChange"
title="纪要标题"
placeholder="按纪要标题查询"
/>

<!-- 重置查询条件按钮 -->
<view class="padding-tb">
<l-button @click="reset" line="orange" class="block" block
>重置查询条件</l-button
>
</view>
</view>
</scroll-view>

<l-customlist-add v-if="!sideOpen" @click="action('add')" />
</view>
</template>


<script>
/*
* 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架(http://www.learun.cn)
* Copyright (c) 2013-2021 上海力软信息技术有限公司
* 创建人:超级管理员
* 日 期:2021-03-08 10:36
* 描 述:会议纪要
*/

/**
* 本段代码由移动端代码生成器输出,移动端须 2.2.0 版本及以上可以使用
* 请在移动端 /pages.json 中的 pages 字段中添加一条记录:
* { "path": "pages/PersonnelManagement/MeetingMinutes/list", "style": { "navigationBarTitleText": "表单列表页" } }
*
* (navigationBarTitleText 字段为本页面的标题文本,可以修改)
* (必须自行操作该步骤,力软代码生成器不会自动帮您修改 /pages.json 文件)
*/
import moment from "moment";
import get from "lodash/get";
import set from "lodash/set";
import pickBy from "lodash/pickBy";
import mapValues from "lodash/mapValues";

export default {
data() {
return {
// 数据项的数据类型、结构
scheme: {
MeetingTitle: { type: "text" },
Title: { type: "text" },
Content: { type: "texteditor" },
Files: { type: "upload" },
},

// 查询条件
searchData: {},
defaultQueryData: {},
queryData: {
MeetID: "",
Title: "",
},

// 数据源
dataSource: {},

// 页面相关参数
meetId: "",
ready: false,
tips: "加载中...",
loadState: "向下翻以加载更多",
sideOpen: false,

// 列表与分页信息
page: 1,
total: 2,
list: [],
};
},

async onLoad(meetId) {
await this.init(meetId);
},
onUnload() {
this.OFF("PersonnelManagementMeetingMinutes-list-change");
},

methods: {
// 页面初始化
async init(meetId) {
console.log(meetId);
this.meetId = meetId.meetId;
this.ON(
"PersonnelManagementMeetingMinutes-list-change",
this.refreshList
);

// 拉取加载列表和数据源
await Promise.all([() => {}]);
await this.fetchList();
// 初始化查询条件
this.defaultQueryData = this.COPY(this.queryData);
this.ready = true;
},

// 拉取列表
async fetchList() {
if (this.page > this.total) {
return;
}
this.searchData.MeetID=this.meetId;
const result = await this.HTTP_GET(
"learun/adms/PersonnelManagement/MeetingMinutes/pagelist",
{
// 这里 sidx 表示排序字段,sord 表示排序方式(DESC=降序,ASC=升序)
// 代码生成器生成时默认按照主键排序,您可以修改成按创建时间的字段降序
pagination: { rows: 10, page: this.page, sidx: "ID", sord: "DESC" },
queryJson: JSON.stringify(this.searchData),
},
"加载数据时出错"
);

if (!result) {
return;
}

this.total = result.total;
this.page = result.page + 1;
this.list = this.list.concat(result.rows);

this.tips = `已加载 ${Math.min(result.page, result.total)} / ${
result.total
} 页,共 ${result.records} 项`;
this.loadState =
result.page >= result.total ? "已加载所有项目" : "向下翻以加载更多";
},

// 刷新清空列表
async refreshList() {
this.page = 1;
this.total = 2;
this.list = [];

await this.fetchList();
},

// 列表下拉
pullDown() {
this.refreshList().then(() => {
this.$refs.list.stopPullDown();
});
},

// 设置搜索条件
async searchChange() {
const result = {};

// 将其他查询项添加到查询 JSON 中
const queryObj = pickBy(this.queryData, (t) =>
Array.isArray(t) ? t.length > 0 : t
);
Object.assign(
result,
mapValues(queryObj, (t) => (Array.isArray(t) ? t.join(",") : t))
);
this.searchData = result;
await this.refreshList();
},

// 点击「清空查询条件」按钮
reset() {
this.queryData = this.COPY(this.defaultQueryData);
this.searchChange();
},

// 点击「编辑」、「查看」、「添加」、「删除」按钮
async action(type, id = "") {
switch (type) {
case "view":
this.NAV_TO(`./single?type=view&id=${id}`);
return;

case "add":
this.NAV_TO("./single?type=create&meetId="+this.meetId);
return;

case "edit":
this.NAV_TO(`./single?type=edit&id=${id}`);
return;

case "delete":
if (!(await this.CONFIRM("删除项目", "确定要删除该项吗?", true))) {
return;
}

this.HTTP_POST(
"learun/adms/PersonnelManagement/MeetingMinutes/delete",
id,
"删除失败"
).then((success) => {
if (!success) {
return;
}
this.TOAST("删除成功", "success");
this.refreshList();
});
return;

default:
return;
}
},

// 显示列表中的标题项
displayListItem(item, field) {
const fieldItem = this.scheme[field];
const value = item[field];

switch (fieldItem.type) {
case "currentInfo":
case "organize":
return fieldItem.dataType === "time"
? value
: get(this.GET_GLOBAL(fieldItem.dataType), `${value}.name`, "");

case "radio":
case "select":
const selectItem = this.dataSource[field].find(
(t) => t.value === String(value)
);
return get(selectItem, "text", "");

case "checkbox":
if (!value || value.split(",").length <= 0) {
return "";
}
const checkboxItems = value.split(",");
return this.dataSource[field]
.filter((t) => checkboxItems.includes(t.value))
.map((t) => t.text)
.join(",");

case "datetime":
if (!value) {
return "";
}
return moment(value).format(
Number(fieldItem.dateformat) === 0
? "YYYY年 M月 D日"
: "YYYY-MM-DD HH:mm"
);

default:
return value === null || value === undefined ? "" : value;
}
},
},
};
</script>


<style lang="less" scoped>
@import "~@/common/css/sidepage.less";
@import "~@/common/css/customlist.less";
</style>

+ 259
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingMinutes/single.vue 查看文件

@@ -0,0 +1,259 @@
<template>
<view class="page">
<view v-if="ready">
<l-input
@input="setValue('MeetingMinutes.Title', $event)"
:value="getValue('MeetingMinutes.Title')"
:disabled="!edit"
title="纪要标题"
/>
<l-textarea
@input="setValue('MeetingMinutes.Content', $event)"
:value="getValue('MeetingMinutes.Content')"
:readonly="!edit"
title="内容"
/>
<l-upload-file
@input="setValue('MeetingMinutes.Files', $event)"
:value="getValue('MeetingMinutes.Files')"
:readonly="!edit"
:number="9"
title="附件上传"
/>
</view>

<view
v-if="ready"
class="bg-white margin-tb padding"
style="padding-top: 0; overflow: hidden"
>
<l-button
v-if="edit"
@click="action('save')"
size="lg"
color="green"
class="block margin-top"
block
>
提交保存
</l-button>
<l-button
v-if="!edit && mode !== 'create'"
@click="action('edit')"
size="lg"
line="orange"
class="block margin-top"
block
>
编辑本页
</l-button>
<l-button
v-if="edit && mode !== 'create'"
@click="action('reset')"
size="lg"
line="red"
class="block margin-top"
block
>
取消编辑
</l-button>
<l-button
v-if="!edit && mode !== 'create'"
@click="action('delete')"
size="lg"
line="red"
class="block margin-top"
block
>
删除
</l-button>
</view>
</view>
</template>


<script>
/*
* 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架(http://www.learun.cn)
* Copyright (c) 2013-2021 上海力软信息技术有限公司
* 创建人:超级管理员
* 日 期:2021-03-08 10:36
* 描 述:会议纪要
*/

/**
* 本段代码由移动端代码生成器输出,移动端须 2.2.0 版本及以上可以使用
* 请在移动端 /pages.json 中的 pages 字段中添加一条记录:
* { "path": "pages/PersonnelManagement/MeetingMinutes/single", "style": { "navigationBarTitleText": "表单详情页" } }
*
* (navigationBarTitleText 字段为本页面的标题文本,可以修改)
* (必须自行操作该步骤,力软代码生成器不会自动帮您修改 /pages.json 文件)
*/

import get from "lodash/get";
import set from "lodash/set";
import moment from "moment";
import customPageMixins from "@/common/custompage.js";

export default {
mixins: [customPageMixins],

data() {
return {
// 页面相关参数
meetId: null,
id: null,
mode: null,
edit: null,
ready: false,

// 表单数据
current: {},
origin: {},

// 表单项数据结构
scheme: {
MeetingMinutes: {
MeetID: { type: "text", title: "会议名称" },
Title: { type: "text", title: "纪要标题" },
Content: { type: "texteditor", title: "内容" },
Files: { type: "upload", title: "附件上传" },
},
},

// 数据源
dataSource: {
MeetingMinutes: {},
},
};
},

async onLoad({ type, id, meetId }) {
await this.init(type, id, meetId);
},

methods: {
// 页面初始化
async init(type, id, meetId) {
this.LOADING("加载数据中...");

this.meetId = meetId;
this.id = id;
this.mode = type;
this.edit = ["create", "edit"].includes(this.mode);

// 拉取表单数据,同时拉取所有来自数据源的选单数据
await Promise.all([() => {}]);
await this.fetchForm();

this.ready = true;
this.HIDE_LOADING();
},

// 加载表单数据
async fetchForm() {
if (this.mode === "create") {
this.origin = await this.getDefaultForm();
} else {
const result = await this.HTTP_GET(
"learun/adms/PersonnelManagement/MeetingMinutes/form",
this.id
);
this.origin = await this.formatFormData(result);
}
this.current = this.COPY(this.origin);
},

// 点击 「编辑」、「重置」、「保存」、「删除」 按钮
async action(type) {
switch (type) {
case "edit":
this.edit = true;
break;

case "reset":
this.current = this.COPY(this.origin);
this.edit = false;
break;

case "save":
const verifyResult = this.verifyForm();
if (verifyResult.length > 0) {
this.CONFIRM("表单验证失败", verifyResult.join("\n"));
return;
}

if (
!(await this.CONFIRM(
"提交确认",
"确定要提交本页表单内容吗?",
true
))
) {
return;
}

this.LOADING("正在提交...");
this.scheme.MeetingMinutes.MeetID = this.meetId;
const postData = await this.getPostData(this.id);
var aa = JSON.parse(postData.strEntity);
aa.MeetID = this.meetId;
postData.strEntity = JSON.stringify(aa);
console.log(postData);
this.HTTP_POST(
"learun/adms/PersonnelManagement/MeetingMinutes/save",
postData,
"表单提交保存失败"
).then((success) => {
this.HIDE_LOADING();
if (!success) {
return;
}

this.EMIT("PersonnelManagementMeetingMinutes-list-change");
this.NAV_BACK();
this.TOAST("提交保存成功");
});
break;

case "delete":
if (!(await this.CONFIRM("删除项目", "确定要删除本项吗?", true))) {
return;
}

this.LOADING("提交删除中...");
this.HTTP_POST(
"learun/adms/PersonnelManagement/MeetingMinutes/delete",
this.id,
"删除失败"
).then((success) => {
this.HIDE_LOADING();
if (!success) {
return;
}

this.EMIT("PersonnelManagementMeetingMinutes-list-change");
this.NAV_BACK();
this.this.TOAST("删除成功", "success");
});
break;

default:
break;
}
},

// 获取表单值
getValue(path) {
return get(this.current, path);
},

// 设置表单值
setValue(path, val) {
set(this.current, path, val);
},
},
};
</script>



+ 1
- 1
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingSignInRecord/list.vue 查看文件

@@ -155,7 +155,7 @@ export default {
if (this.page > this.total) { return }

const result = await this.HTTP_GET(
'/PersonnelManagement/MeetingSignInRecord/pagelist',
'learun/adms/PersonnelManagement/MeetingSignInRecord/pagelist',
{
// 这里 sidx 表示排序字段,sord 表示排序方式(DESC=降序,ASC=升序)
// 代码生成器生成时默认按照主键排序,您可以修改成按创建时间的字段降序


+ 45
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/PersonnelManagement/MeetingSignInScan/list.vue 查看文件

@@ -0,0 +1,45 @@
<template>
<view class="page">
<view class="btn" @click="tapScan"> 扫码 </view>
</view>
</template>

<script>
import scanCodeFun from "@/common/js/scanCodeFun.js";
export default {
data() {
return {};
},
methods: {
init() {
let _this = this;
scanCodeFun.scanCodeFun().then((res) => {
if (!res) return;
var userInfo = this.GET_GLOBAL("loginUser");
var result = this.HTTP_GET(
"learun/adms/PersonnelManagement/MeetingSignInRecord/scan",
{
userid: userInfo.userId,
meetid: res.result,
},
"签到时出错"
).then(res1=>{this.TOAST(res1.result )})
});
},
tapScan() {
this.init();
},
},
mounted() {
let _this = this;
setTimeout(function () {
_this.init();
}, 100);
},
};
</script>

<style lang="less" scoped>
@import "~@/common/css/sidepage.less";
@import "~@/common/css/customlist.less";
</style>

+ 0
- 1
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/WelcomNewStudents/ConfirmStudentsCheckIn/list.vue 查看文件

@@ -16,7 +16,6 @@ export default {
init() {
let _this = this;
scanCodeFun.scanCodeFun().then(res => {
console.log(res);
if(!res) return;
this.NAV_TO('./from', { StuNo: res.result }, true);
})


正在加载...
取消
保存