diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Mobile/www/scripts/weixinlogin.js b/Learun.Framework.Ultimate V7/Learun.Application.Mobile/www/scripts/weixinlogin.js index 25040bdd0..e85594037 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Mobile/www/scripts/weixinlogin.js +++ b/Learun.Framework.Ultimate V7/Learun.Application.Mobile/www/scripts/weixinlogin.js @@ -1,4 +1,4 @@ -function GetQueryString(name) { +function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg);//search,查询?后面的参数,并匹配正则 if (r != null) return unescape(r[2]); return null; diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Controllers/StuInfoFreshController.cs b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Controllers/StuInfoFreshController.cs index 2b16551e5..7a7ed688d 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Controllers/StuInfoFreshController.cs +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Controllers/StuInfoFreshController.cs @@ -665,7 +665,7 @@ namespace Learun.Application.Web.Areas.EducationalAdministration.Controllers FinaChargesStandardList = FinaChargesStandardList, StuInfoFreshFamilyList = stuInfoFreshFamily, PayFeeTotal = PayFeeTotal, - YJAmount = FeeOrderList.Sum(x => x.SJAmount) + YJAmount = FinaChargesStandardList.Sum(x => x.PayedMoney) }; return Success(jsonData); } @@ -1321,9 +1321,6 @@ namespace Learun.Application.Web.Areas.EducationalAdministration.Controllers if (!string.IsNullOrEmpty(imgUrl)) { - // model.PayFeeDetail = entity.PayFeeDetail; - // model.PayMoney = entity.PayMoney; - model.LoanMoney = entity.LoanMoney; model.orderid = orderid; stuInfoFreshIBLL.SaveFeeData(keyValue, model, list); } diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeForm.js b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeForm.js index 5b3bcea2d..b60c0fd5b 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeForm.js +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeForm.js @@ -115,6 +115,7 @@ var bootstrap = function ($, learun) { var detail = ""; var ifisnull = false; $('.paydetail').each(function (i, item) { + $(this).attr('disabled', 'disabled'); var value = 0; if (!!$(this).val()) { value = parseFloat($(this).val()); @@ -142,8 +143,6 @@ var bootstrap = function ($, learun) { param.PayMoney = $('#PayMoney').html(); learun.loading(true, '正在生成付款信息请稍等...'); $("#confirmPayFee").hide(); - console.log(JSON.stringify(param)); - console.log(JSON.stringify(list)); learun.httpAsyncPost(top.$.rootUrl + '/EducationalAdministration/StuInfoBasic_PayFee/PayFeeQRCode?keyValue=' + keyValue, { strEntity: JSON.stringify(param), detailList: JSON.stringify(list) }, function (res) { learun.loading(false); $('#qrcodeImg').attr('src', res.info); diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeIndex.js b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeIndex.js index 3e35a3640..d81f978cf 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeIndex.js +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoBasic_PayFee/PayFeeIndex.js @@ -52,7 +52,7 @@ var bootstrap = function ($, learun) { title: '二维码缴费', url: top.$.rootUrl + '/EducationalAdministration/StuInfoBasic_PayFee/PayFeeForm?keyValue=' + keyValue, width: 800, - height: 650, + height: 690, btn: null }); } @@ -108,7 +108,7 @@ var bootstrap = function ($, learun) { { label: "性别", name: "GenderNo", width: 80, align: "left", formatter: function (cellvalue) { - return cellvalue == true ? "男" : "女"; + return cellvalue === true ? "男" : "女"; } }, { label: "身份证号", name: "IdentityCardNo", width: 150, align: "left" }, diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeForm.js b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeForm.js index b2e933427..94fcac8ec 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeForm.js +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeForm.js @@ -102,7 +102,7 @@ var bootstrap = function ($, learun) { $.each(data['FinaChargesStandardList'], function (i, item) { html += '' + item.ChargeItemName + '' + item.Standard + '元'; }); - html += '应缴合计' + data['PayFeeTotal'] + '元'; + html += '应缴合计' + data['PayFeeTotal'] + '元' + PayFeeTotal+''; html += '  '; html += '已缴金额' + YJAmount + ''; $('#PayFeeDetail').html(html); @@ -114,6 +114,7 @@ var bootstrap = function ($, learun) { var detail = ""; var ifisnull = false; $('.paydetail').each(function (i, item) { + $(this).attr('disabled', 'disabled'); var value = 0; if (!!$(this).val()) { value = parseFloat($(this).val()); diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeIndex.js b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeIndex.js index 5378db388..d2e3bcadf 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeIndex.js +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Areas/EducationalAdministration/Views/StuInfoFresh/PayFeeIndex.js @@ -53,7 +53,7 @@ var bootstrap = function ($, learun) { title: '二维码缴费', url: top.$.rootUrl + '/EducationalAdministration/StuInfoFresh/PayFeeForm?keyValue=' + keyValue, width: 800, - height: 650, + height: 690, btn: null }); } @@ -302,8 +302,14 @@ var bootstrap = function ($, learun) { { label: '学号', name: 'StuNo', width: 100, align: "left" }, { label: '姓名', name: 'StuName', width: 100, align: "left" }, { - label: '线上缴费状态', name: 'PayFeeStatus', width: 100, align: "left", formatter: function (value) { - return value == 1 ? "已缴费" : "未缴费"; + label: '线上缴费状态', name: 'PayFeeStatus', width: 100, align: "left", formatterAsync: function (callback, value, row, op, $cell) { + learun.clientdata.getAsync('dataItem', { + key: value, + code: 'PayStatus', + callback: function (_data) { + callback(_data.text); + } + }); } }, { label: '线上缴费时间', name: 'PayFeeDate', width: 130, align: "left" }, diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/UserCenter/Index.cshtml b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/UserCenter/Index.cshtml index 650777d0a..067e4e9a1 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/UserCenter/Index.cshtml +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/UserCenter/Index.cshtml @@ -15,14 +15,14 @@
@@ -190,6 +190,7 @@ }, filters: { sex: function (value) { + console.log(value); return value ? "男生" : "女生"; }, @@ -686,7 +687,7 @@
@if (ViewBag.UserType == "学生") { -
+ @*

西昌民族幼儿师范高等专科学校

@@ -710,7 +711,7 @@ 3、选择课只开放三天,三天后自动关闭选课功能,每门选修课记2个选修学分,如果修不够选修学分将会无法毕业。

-
+
*@ } @if (ViewBag.UserType == "学生" || ViewBag.UserType == "教师") @@ -742,8 +743,8 @@ $("#headUrl").attr("src", "/LR_OrganizationModule/User/GetImg?userId=" + loginInfo.userId); if ('@ViewBag.UserType' == '学生') { - $("#lr_left_list").children('li').eq(4).addClass("active"); - $('.lr-layout-wrap-item').eq(5).addClass("active"); + $("#lr_left_list").children('li').eq(0).addClass("active"); + $('.lr-layout-wrap-item').eq(0).addClass("active"); } else { $("#lr_left_list").children('li').eq(0).addClass("active"); diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/XmlConfig/system.config b/Learun.Framework.Ultimate V7/Learun.Application.Web/XmlConfig/system.config index e17755adc..26ba167ed 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.Web/XmlConfig/system.config +++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/XmlConfig/system.config @@ -154,7 +154,7 @@ - + diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj index b15e9bd60..9d30b0df7 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj @@ -156,6 +156,9 @@ + + ..\packages\ThoughtWorks.QRCode.1.1.0\lib\ThoughtWorks.QRCode.dll + ..\packages\WebGrease.1.5.2\lib\WebGrease.dll @@ -192,6 +195,8 @@ + + diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AnnexesApiWx.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AnnexesApiWx.cs index 4795d3d47..8d754269b 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AnnexesApiWx.cs +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AnnexesApiWx.cs @@ -7,136 +7,135 @@ using System.IO; namespace Learun.Application.WebApi.Modules { - public class AnnexesApiWx : BaseApi - { - public AnnexesApiWx() - : base("/learun/adms/annexes") + public class AnnexesApiWx : BaseApi { - Get["/wxlist"] = WxGetList; - Get["/wxdown"] = WxDownload; - Get["/wxfileinfo"] = WxFileInfo; - Post["/wxupload"] = WxUpload; - Post["/wxdelete"] = WxDeleteFile; + public AnnexesApiWx() + : base("/learun/adms/annexes") + { + Get["/wxlist"] = WxGetList; + Get["/wxdown"] = WxDownload; + Get["/wxfileinfo"] = WxFileInfo; + Post["/wxupload"] = WxUpload; + Post["/wxdelete"] = WxDeleteFile; + } + private AnnexesFileIBLL annexesFileIBLL = new AnnexesFileBLL(); + + /// + /// 获取附件列表 + /// + /// + /// + public Response WxGetList(dynamic _) + { + var keyValue = this.GetReqData(); + var list = annexesFileIBLL.GetList(keyValue); + + return Success(list); + } + + /// + /// 上传附件图片文件 + /// + /// + public Response WxUpload(dynamic _) + { + var files = (List)this.Context.Request.Files; + string folderId = Request.Form["folderId"]; + string filePath = Config.GetValue("AnnexesFile"); + string uploadDate = DateTime.Now.ToString("yyyyMMdd"); + string fileEextension = Path.GetExtension(files[0].Name); + string fileType = fileEextension.Replace(".", ""); + string fileGuid = Guid.NewGuid().ToString(); + + string virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, fileEextension); + + //创建文件夹 + string path = Path.GetDirectoryName(virtualPath); + Directory.CreateDirectory(path); + AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity(); + if (!System.IO.File.Exists(virtualPath)) + { + byte[] bytes = new byte[files[0].Value.Length]; + files[0].Value.Read(bytes, 0, bytes.Length); + FileInfo file = new FileInfo(virtualPath); + FileStream fs = file.Create(); + fs.Write(bytes, 0, bytes.Length); + fs.Close(); + + //文件信息写入数据库 + fileAnnexesEntity.F_Id = fileGuid; + fileAnnexesEntity.F_FileName = files[0].Name; + fileAnnexesEntity.F_FilePath = virtualPath; + fileAnnexesEntity.F_FileSize = files[0].Value.Length.ToString(); + fileAnnexesEntity.F_FileExtensions = fileEextension; + fileAnnexesEntity.F_FileType = fileType; + fileAnnexesEntity.F_CreateUserId = userInfo.userId; + fileAnnexesEntity.F_CreateUserName = userInfo.realName; + + annexesFileIBLL.SaveEntity(folderId, fileAnnexesEntity); + } + + return SuccessString(folderId); + } + + /// + /// 获取文件信息 + /// + /// + /// + public Response WxFileInfo(dynamic _) + { + var fileId = this.GetReqData(); + var fileEntity = annexesFileIBLL.GetEntity(fileId); + + return Success(fileEntity); + } + + /// + /// 删除文件 + /// + /// + /// + public Response WxDeleteFile(dynamic _) + { + var fileId = this.GetReqData(); + AnnexesFileEntity fileInfoEntity = annexesFileIBLL.GetEntity(fileId); + annexesFileIBLL.DeleteEntity(fileId); + //删除文件 + if (System.IO.File.Exists(fileInfoEntity.F_FilePath)) + { + System.IO.File.Delete(fileInfoEntity.F_FilePath); + } + + return Success("删除成功"); + } + + /// + /// 下载文件,微信小程序用 + /// + /// 微信小程序可以预览图片、文档 + /// 支持的图片格式:.jpg .png .webp .gif + /// 支持的文档格式:.doc(x) .xls(x) .ppt(x) .pdf + /// + /// 对于其他格式的文件,微信小程序官方未提供打开或预览的 API,文件对用户来说不可访问 + /// + /// + /// + public Response WxDownload(dynamic _) + { + string name = this.GetReqData(); + string fileId = name.Split('.')[0]; + var fileEntity = annexesFileIBLL.GetEntity(fileId); + string filepath = fileEntity.F_FilePath; + + if (!FileDownHelper.FileExists(filepath)) + { + return 404; + } + + FileDownHelper.DownLoadWx(filepath, fileEntity.F_FileType); + + return Success(""); + } } - private AnnexesFileIBLL annexesFileIBLL = new AnnexesFileBLL(); - - /// - /// 获取附件列表 - /// - /// - /// - public Response WxGetList(dynamic _) - { - var keyValue = this.GetReqData(); - var list = annexesFileIBLL.GetList(keyValue); - - return Success(list); - } - - /// - /// 上传附件图片文件 - /// - /// - public Response WxUpload(dynamic _) - { - var files = (List)this.Context.Request.Files; - var folderId = this.GetReqData(); - - string filePath = Config.GetValue("AnnexesFile"); - string uploadDate = DateTime.Now.ToString("yyyyMMdd"); - string fileEextension = Path.GetExtension(files[0].Name); - string fileType = fileEextension.Replace(".", ""); - string fileGuid = Guid.NewGuid().ToString(); - - string virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, fileEextension); - - //创建文件夹 - string path = Path.GetDirectoryName(virtualPath); - Directory.CreateDirectory(path); - AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity(); - if (!System.IO.File.Exists(virtualPath)) - { - byte[] bytes = new byte[files[0].Value.Length]; - files[0].Value.Read(bytes, 0, bytes.Length); - FileInfo file = new FileInfo(virtualPath); - FileStream fs = file.Create(); - fs.Write(bytes, 0, bytes.Length); - fs.Close(); - - //文件信息写入数据库 - fileAnnexesEntity.F_Id = fileGuid; - fileAnnexesEntity.F_FileName = files[0].Name; - fileAnnexesEntity.F_FilePath = virtualPath; - fileAnnexesEntity.F_FileSize = files[0].Value.Length.ToString(); - fileAnnexesEntity.F_FileExtensions = fileEextension; - fileAnnexesEntity.F_FileType = fileType; - fileAnnexesEntity.F_CreateUserId = userInfo.userId; - fileAnnexesEntity.F_CreateUserName = userInfo.realName; - - annexesFileIBLL.SaveEntity(folderId, fileAnnexesEntity); - } - - return SuccessString(fileGuid); - } - - /// - /// 获取文件信息 - /// - /// - /// - public Response WxFileInfo(dynamic _) - { - var fileId = this.GetReqData(); - var fileEntity = annexesFileIBLL.GetEntity(fileId); - - return Success(fileEntity); - } - - /// - /// 删除文件 - /// - /// - /// - public Response WxDeleteFile(dynamic _) - { - var fileId = this.GetReqData(); - AnnexesFileEntity fileInfoEntity = annexesFileIBLL.GetEntity(fileId); - annexesFileIBLL.DeleteEntity(fileId); - //删除文件 - if (System.IO.File.Exists(fileInfoEntity.F_FilePath)) - { - System.IO.File.Delete(fileInfoEntity.F_FilePath); - } - - return Success("删除成功"); - } - - /// - /// 下载文件,微信小程序用 - /// - /// 微信小程序可以预览图片、文档 - /// 支持的图片格式:.jpg .png .webp .gif - /// 支持的文档格式:.doc(x) .xls(x) .ppt(x) .pdf - /// - /// 对于其他格式的文件,微信小程序官方未提供打开或预览的 API,文件对用户来说不可访问 - /// - /// - /// - public Response WxDownload(dynamic _) - { - string name = this.GetReqData(); - string fileId = name.Split('.')[0]; - var fileEntity = annexesFileIBLL.GetEntity(fileId); - string filepath = fileEntity.F_FilePath; - - if (!FileDownHelper.FileExists(filepath)) - { - return 404; - } - - FileDownHelper.DownLoadWx(filepath, fileEntity.F_FileType); - - return Success(""); - } - } } \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/FormApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/FormApi.cs index a574ac806..0a2ac508e 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/FormApi.cs +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/FormApi.cs @@ -21,12 +21,28 @@ namespace Learun.Application.WebApi.Modules { Get["/scheme"] = GetScheme; Get["/data"] = GetData; + Get["/folderkey"] = GetFolderkey; Post["/save"] = Save; Post["/delete"] = DeleteForm; } private FormSchemeIBLL formSchemeIBLL = new FormSchemeBLL(); + + private Response GetFolderkey(dynamic _) + { + List req = this.GetReqData>();// 获取模板请求数据 + Dictionary dic = new Dictionary(); + foreach (var item in req) + { + if (!string.IsNullOrEmpty(item.processIdName)) + { + var data = formSchemeIBLL.GetFolderKey(item.schemeInfoId, item.processIdName, item.keyValue);// + dic = data; + } + } + return Success(dic); + } /// /// 获取表单模板数据 /// @@ -104,6 +120,35 @@ namespace Learun.Application.WebApi.Modules } #region 请求参数 + + private class FolderKeyReq + { + /// + /// 表单请求Id + /// + public string id { get; set; } + /// + /// 当前自定义表单版本号 + /// + public string ver { get; set; } + /// + /// 流程模板id + /// + public string schemeInfoId { get; set; } + /// + /// 关联字段名称 + /// + public string processIdName { get; set; } + /// + /// 数据主键值 + /// + public string keyValue { get; set; } + /// + /// 表单数据 + /// + public string formData { get; set; } + } + private class SchemeReq { /// /// 表单请求Id diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuFreshPayFeeApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuFreshPayFeeApi.cs new file mode 100644 index 000000000..961802cc4 --- /dev/null +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuFreshPayFeeApi.cs @@ -0,0 +1,219 @@ +using System; +using Learun.Application.Organization; +using Learun.Application.TwoDevelopment.EducationalAdministration; +using Learun.Application.TwoDevelopment.EvaluationTeach; +using Learun.Util; +using Nancy; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Web; +using System.Web.Mvc; +using Learun.Application.Base.SystemModule; +using Learun.Application.TwoDevelopment.Ask; +using Learun.Application.TwoDevelopment.ReceiveSendFeeManagement; +using Newtonsoft.Json; +using ThoughtWorks.QRCode.Codec; + +namespace Learun.Application.WebApi.Modules +{ + /// + /// 版 本 Learun-ADMS V7.0.0 数字化智慧校园 + /// Copyright (c) 2013-2018 北京泉江科技有限公司 + /// 创建人:数字化智慧校园-框架开发组 + /// 日 期:2018.01.04 + /// 描 述:部门管理 + /// + public class StuFreshPayFeeApi : BaseApi + { + public StuFreshPayFeeApi() + : base("/learun/freshpayfee") + { + Get["/getpayfeelist"] = GetPayfeeList;// 获取缴费列表 + Get["/getpayfeeinfo"] = GetPayfeeInfo;//获取缴费明细 + Post["/generateqrcode"] = PayFeeQRCode;//生成缴费二维码 + Get["/getinvoice"] = GetInvoice;//获取发票 + } + + private StuInfoFreshIBLL stuInfoFreshIBLL = new StuInfoFreshBLL(); + private FinaChargesStandardIBLL finaChargesStandardIBLL = new FinaChargesStandardBLL(); + + public Response GetInvoice(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + var list = stuInfoFreshIBLL.GetStuEnrollFeeOrder(keyValue, true); + return Success(list); + } + + public Response GetPayfeeList(dynamic _) + { + ReqPageParam parameter = this.GetReqData(); + var data = stuInfoFreshIBLL.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); + } + + public Response GetPayfeeInfo(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + int jiaoFeiYear = DateTime.Now.Year; + var StuInfoFreshData = stuInfoFreshIBLL.GetStuInfoFreshEntity(keyValue); + var stuInfoFreshFamily = stuInfoFreshIBLL.GetStuInfoFreshFamilyList(keyValue); + //当前年度缴费记录 + var FeeOrderList = stuInfoFreshIBLL.GetFeeOrderList(StuInfoFreshData.StuNo, jiaoFeiYear); + var FinaChargesStandardList = new List(); + FinaChargesStandardList = finaChargesStandardIBLL.GetFinaChargesStandardListByYongYou(StuInfoFreshData.StuNo, jiaoFeiYear).ToList(); + var PayFeeTotal = FinaChargesStandardList.Select(x => x.Standard).Sum(); + var jsonData = new + { + StuInfoFreshData = StuInfoFreshData, + FinaChargesStandardList = FinaChargesStandardList, + StuInfoFreshFamilyList = stuInfoFreshFamily, + PayFeeTotal = PayFeeTotal, + YJAmount = FeeOrderList.Sum(x => x.SJAmount) + }; + return Success(jsonData); + } + + + public class PayfeeRequest + { + public string strEntity { get; set; } + public string detailList { get; set; } + } + + /// + /// 生成缴费二维码 + /// + /// + public Response PayFeeQRCode(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + PayfeeRequest parameter = this.GetReqData(); + StuInfoFreshEntity entity = parameter.strEntity.ToObject(); + List list = parameter.detailList.ToObject>(); + var model = stuInfoFreshIBLL.GetStuInfoFreshEntity(keyValue); + var imgUrl = ""; + Random ran = new Random(); + string merchantid = "105000082201406";//商户号 + string posid = "043724806";//商户柜台代码 + string branchid = "510000000";//分行代码 + string orderid = DateTime.Now.ToString("yyyyMMddhhmmss") + ran.Next(0, 100000); + string payment = entity.PayMoney.ToString(); + string curcode = "01"; + string txcode = "530550"; + string remark1 = model.StuNo; + string remark2 = "20" + model.Grade; + string returntype = "3"; + string timeout = DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"); + string pub32tr2 = "40d987faa793a0a27e7a86ef020111"; + string bankURL = "https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6"; + string tmp = "MERCHANTID=" + merchantid + "&POSID=" + posid + "&BRANCHID=" + branchid + "&ORDERID=" + orderid; + tmp += "&PAYMENT=" + payment + "&CURCODE=" + curcode + "&TXCODE=" + txcode + "&REMARK1=" + remark1; + tmp += "&REMARK2=" + remark2 + "&RETURNTYPE=" + returntype + "&TIMEOUT=" + timeout; + MD5 md5 = MD5.Create(); + string tmp1 = tmp; + tmp += "&PUB=" + pub32tr2; + byte[] buffer = Encoding.Default.GetBytes(tmp); + byte[] md5Buffer = md5.ComputeHash(buffer); + string strMd5 = ""; + //hdnOrderId.Value = orderid; + foreach (byte item in md5Buffer) + { + strMd5 += item.ToString("x2"); + } + string url = bankURL + "&" + tmp1 + "&MAC=" + strMd5; + string reJson = HttpMethods.Post(url); + LogEntity logEntity = new LogEntity(); + logEntity.F_CategoryId = 121; + logEntity.F_ExecuteResultJson = reJson; + logEntity.WriteLog(); + //HttpConnect conn = new HttpConnect(); + //string reJson = conn.Post(url, ""); + JsonBean MemberInfoList = JsonConvert.DeserializeObject(reJson); + if (MemberInfoList.SUCCESS.Equals("true")) + { + string imgCode = HttpMethods.Post(MemberInfoList.PAYURL); + logEntity.F_CategoryId = 121; + logEntity.F_ExecuteResultJson = imgCode; + logEntity.WriteLog(); + MemberInfoList = JsonConvert.DeserializeObject(imgCode); + if (MemberInfoList.SUCCESS.Equals("true")) + { + imgUrl = CreateQRImg(MemberInfoList.QRURL, orderid); + } + } + + if (!string.IsNullOrEmpty(imgUrl)) + { + // model.PayFeeDetail = entity.PayFeeDetail; + // model.PayMoney = entity.PayMoney; + model.LoanMoney = entity.LoanMoney; + model.orderid = orderid; + stuInfoFreshIBLL.SaveFeeData(keyValue, model, list); + } + + return Success(imgUrl); + } + + public class JsonBean + { + /// + /// + /// + public string SUCCESS { get; set; } + public string PAYURL { get; set; } + public string QRURL { get; set; } + } + /// + /// 生成并保存二维码图片的方法 + /// + /// 输入的内容 + public string CreateQRImg(string str, string orderId) + { + string QRCodeFile = Config.GetValue("QRCodeFile"); + Random ran = new Random(); + Bitmap bt; + str = HttpUtility.UrlDecode(str); + string enCodeString = str; + //生成设置编码实例 + QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); + //设置二维码的规模,默认4 + qrCodeEncoder.QRCodeScale = 3; + //设置二维码的版本,默认7 + qrCodeEncoder.QRCodeVersion = 7; + //设置错误校验级别,默认中等 + qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; + //生成二维码图片 + bt = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8); + //二维码图片的名称 + string filename = orderId; + if (!DirFileHelper.IsExistFile(QRCodeFile + "/Content/images/QRCode/")) + { + Directory.CreateDirectory(QRCodeFile + "/Content/images/QRCode/"); + } + var path = QRCodeFile + "/Content/images/QRCode/" + filename + ".jpg"; + //保存二维码图片在photos路径下 + try + { + bt.Save(path); + } + catch (Exception ex) + { + return ""; + } + + //图片控件要显示的二维码图片路径 + return QRCodeFile + "/Content/images/QRCode/" + filename + ".jpg"; + } + } +} \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuPayFeeApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuPayFeeApi.cs new file mode 100644 index 000000000..52cc62442 --- /dev/null +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/StuPayFeeApi.cs @@ -0,0 +1,215 @@ +using System; +using Learun.Application.Organization; +using Learun.Application.TwoDevelopment.EducationalAdministration; +using Learun.Application.TwoDevelopment.EvaluationTeach; +using Learun.Util; +using Nancy; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Web; +using System.Web.Mvc; +using Learun.Application.Base.SystemModule; +using Learun.Application.TwoDevelopment.Ask; +using Learun.Application.TwoDevelopment.ReceiveSendFeeManagement; +using Newtonsoft.Json; +using ThoughtWorks.QRCode.Codec; + +namespace Learun.Application.WebApi.Modules +{ + /// + /// 版 本 Learun-ADMS V7.0.0 数字化智慧校园 + /// Copyright (c) 2013-2018 北京泉江科技有限公司 + /// 创建人:数字化智慧校园-框架开发组 + /// 日 期:2018.01.04 + /// 描 述:部门管理 + /// + public class StuPayFeeApi : BaseApi + { + public StuPayFeeApi() + : base("/learun/payfee") + { + Get["/getpayfeelist"] = GetPayfeeList;// 获取缴费列表 + Get["/getpayfeeinfo"] = GetPayfeeInfo;//获取缴费明细 + Post["/generateqrcode"] = PayFeeQRCode;//生成缴费二维码 + Get["/getinvoice"] = GetInvoice;//获取发票 + } + + private StuInfoBasic_PayFeeIBLL stuInfoBasic_PayFeeIBLL = new StuInfoBasic_PayFeeBLL(); + private StuInfoBasicIBLL stuInfoBasicIbll = new StuInfoBasicBLL(); + private StuInfoFreshIBLL stuInfoFreshIBLL = new StuInfoFreshBLL(); + private FinaChargesStandardIBLL finaChargesStandardIBLL = new FinaChargesStandardBLL(); + + public Response GetInvoice(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + var list = stuInfoFreshIBLL.GetStuEnrollFeeOrder(keyValue, false); + return Success(list); + } + + public Response GetPayfeeList(dynamic _) + { + ReqPageParam parameter = this.GetReqData(); + var data = stuInfoBasic_PayFeeIBLL.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); + } + + public Response GetPayfeeInfo(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + var stuInfoBasic_PayFeeEntity = stuInfoBasic_PayFeeIBLL.GetStuInfoBasic_PayFeeEntity(keyValue); + var StuInfoFreshData = stuInfoBasicIbll.GetStuInfoBasicEntityByStuNo(stuInfoBasic_PayFeeEntity.StuNo); + //当前年度缴费记录 + var FinaChargesStandardList = new List(); + FinaChargesStandardList = finaChargesStandardIBLL.GetFinaChargesStandardListByYongYou(StuInfoFreshData.StuNo, stuInfoBasic_PayFeeEntity.PayYear.Value).ToList(); + var PayFeeTotal = FinaChargesStandardList.Select(x => x.SJAmount).Sum(); + var jsonData = new + { + StuInfoFreshData = StuInfoFreshData, + FinaChargesStandardList = FinaChargesStandardList, + PayFeeTotal = PayFeeTotal, + YJAmount = FinaChargesStandardList.Sum(x => x.PayedMoney) + }; + return Success(jsonData); + } + + + public class PayfeeRequest + { + public string strEntity { get; set; } + public string detailList { get; set; } + } + + /// + /// 生成缴费二维码 + /// + /// + public Response PayFeeQRCode(dynamic _) + { + string keyValue = Request.Query["keyValue"]; + PayfeeRequest parameter = this.GetReqData(); + StuInfoFreshEntity entity = parameter.strEntity.ToObject(); + List list = parameter.detailList.ToObject>(); + var model = stuInfoBasic_PayFeeIBLL.GetStuInfoBasic_PayFeeEntity(keyValue); + var imgUrl = ""; + Random ran = new Random(); + string merchantid = "105000082201406";//商户号 + string posid = "043724806";//商户柜台代码 + string branchid = "510000000";//分行代码 + string orderid = DateTime.Now.ToString("yyyyMMddhhmmss") + ran.Next(0, 100000); + string payment = entity.PayMoney.ToString(); + string curcode = "01"; + string txcode = "530550"; + string remark1 = model.StuNo; + string remark2 = model.PayYear.ToString(); + string returntype = "3"; + string timeout = DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"); + string pub32tr2 = "40d987faa793a0a27e7a86ef020111"; + string bankURL = "https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6"; + string tmp = "MERCHANTID=" + merchantid + "&POSID=" + posid + "&BRANCHID=" + branchid + "&ORDERID=" + orderid; + tmp += "&PAYMENT=" + payment + "&CURCODE=" + curcode + "&TXCODE=" + txcode + "&REMARK1=" + remark1; + tmp += "&REMARK2=" + remark2 + "&RETURNTYPE=" + returntype + "&TIMEOUT=" + timeout; + MD5 md5 = MD5.Create(); + string tmp1 = tmp; + tmp += "&PUB=" + pub32tr2; + byte[] buffer = Encoding.Default.GetBytes(tmp); + byte[] md5Buffer = md5.ComputeHash(buffer); + string strMd5 = ""; + //hdnOrderId.Value = orderid; + foreach (byte item in md5Buffer) + { + strMd5 += item.ToString("x2"); + } + string url = bankURL + "&" + tmp1 + "&MAC=" + strMd5; + string reJson = HttpMethods.Post(url); + LogEntity logEntity = new LogEntity(); + logEntity.F_CategoryId = 121; + logEntity.F_ExecuteResultJson = reJson; + logEntity.WriteLog(); + //HttpConnect conn = new HttpConnect(); + //string reJson = conn.Post(url, ""); + JsonBean MemberInfoList = JsonConvert.DeserializeObject(reJson); + if (MemberInfoList.SUCCESS.Equals("true")) + { + string imgCode = HttpMethods.Post(MemberInfoList.PAYURL); + logEntity.F_CategoryId = 121; + logEntity.F_ExecuteResultJson = imgCode; + logEntity.WriteLog(); + MemberInfoList = JsonConvert.DeserializeObject(imgCode); + if (MemberInfoList.SUCCESS.Equals("true")) + { + imgUrl = CreateQRImg(MemberInfoList.QRURL, orderid); + } + } + + if (!string.IsNullOrEmpty(imgUrl)) + { + model.orderid = orderid; + stuInfoFreshIBLL.SaveFeeData(keyValue, model, list); + } + + return Success(imgUrl); + } + + public class JsonBean + { + /// + /// + /// + public string SUCCESS { get; set; } + public string PAYURL { get; set; } + public string QRURL { get; set; } + } + /// + /// 生成并保存二维码图片的方法 + /// + /// 输入的内容 + public string CreateQRImg(string str, string orderId) + { + string QRCodeFile = Config.GetValue("QRCodeFile"); + Random ran = new Random(); + Bitmap bt; + str = HttpUtility.UrlDecode(str); + string enCodeString = str; + //生成设置编码实例 + QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); + //设置二维码的规模,默认4 + qrCodeEncoder.QRCodeScale = 3; + //设置二维码的版本,默认7 + qrCodeEncoder.QRCodeVersion = 7; + //设置错误校验级别,默认中等 + qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; + //生成二维码图片 + bt = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8); + //二维码图片的名称 + string filename = orderId; + if (!DirFileHelper.IsExistFile(QRCodeFile+"/Content/images/QRCode/")) + { + Directory.CreateDirectory(QRCodeFile + "/Content/images/QRCode/"); + } + var path = QRCodeFile + "/Content/images/QRCode/" + filename + ".jpg"; + //保存二维码图片在photos路径下 + try + { + bt.Save(path); + } + catch (Exception ex) + { + return ""; + } + + //图片控件要显示的二维码图片路径 + return QRCodeFile + "/Content/images/QRCode/" + filename + ".jpg"; + } + } +} \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/WeixinApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/WeixinApi.cs index ee3d82139..36e9881ad 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/WeixinApi.cs +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/WeixinApi.cs @@ -36,6 +36,8 @@ namespace Learun.Application.WebApi.Modules Get["/weixinconfig"] = GetWeixinConfig; Post["/getweixinaccess_token"] = GetWeixinAccess_token; Post["/login"] = Login; + //新生首次登陆 + Post["/loginbyidcard"] = LoginByIdCard; Get["/getweixinwebaccess_token"] = GetWeixinWebaccess_token; //获取ACIp Get["/GetACIp"] = GetACIp; @@ -100,6 +102,13 @@ namespace Learun.Application.WebApi.Modules return Success(new { appid, secret }); } + public class wxinfo + { + public string errcode { get; set; } + public string errmsg { get; set; } + public string openid { get; set; } + } + public Response GetWeixinAccess_token(dynamic _) { var entity = weChatConfigIbll.GetEnableEntity(); @@ -110,7 +119,7 @@ namespace Learun.Application.WebApi.Modules var responsejson = HttpGet("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code"); if (!string.IsNullOrEmpty(responsejson)) { - var weixintokenobj = JsonConvert.DeserializeObject(responsejson); + var weixintokenobj = JsonConvert.DeserializeObject(responsejson); if (string.IsNullOrEmpty(weixintokenobj.errcode)) { string openid = weixintokenobj.openid; @@ -241,6 +250,77 @@ namespace Learun.Application.WebApi.Modules #endregion } + private Response LoginByIdCard(dynamic _) + { + LoginModel loginModel = this.GetReqData(); + + #region 内部账户验证 + UserEntity userEntity = userIbll.CheckLoginByIdCard(loginModel.username, loginModel.password); + + #region 写入日志 + LogEntity logEntity = new LogEntity(); + logEntity.F_CategoryId = 1; + logEntity.F_OperateTypeId = ((int)OperationType.Login).ToString(); + logEntity.F_OperateType = EnumAttribute.GetDescription(OperationType.Login); + logEntity.F_OperateAccount = loginModel.username + "(" + userEntity.F_RealName + ")"; + logEntity.F_OperateUserId = !string.IsNullOrEmpty(userEntity.F_UserId) ? userEntity.F_UserId : loginModel.username; + logEntity.F_Module = Config.GetValue("SoftName"); + logEntity.F_Description = "移动端"; + #endregion + + if (!userEntity.LoginOk)//登录失败 + { + //写入日志 + logEntity.F_ExecuteResult = 0; + logEntity.F_ExecuteResultJson = "登录失败:" + userEntity.LoginMsg; + logEntity.WriteLog(); + return Fail(userEntity.LoginMsg); + } + else + { + ReqParameter req = this.Bind(); + string token = OperatorHelper.Instance.AddLoginUser(userEntity.F_Account, "Learun_ADMS_6.1_App", req.loginMark, false);//写入缓存信息 + //写入日志 + logEntity.F_ExecuteResult = 1; + logEntity.F_ExecuteResultJson = "登录成功"; + logEntity.WriteLog(); + OperatorResult res = OperatorHelper.Instance.IsOnLine(token, req.loginMark); + res.userInfo.password = null; + res.userInfo.secretkey = null; + var studententity = stuInfoBasicIBLL.GetStuInfoBasicEntityByStuNo(userEntity.F_Account); + if (studententity != null) + { + res.userInfo.grade = studententity.Grade; + var majorinfo = majorIbll.GetCdMajorEntityByMajorNo(studententity.MajorNo); + if (majorinfo != null) + { + res.userInfo.majorno = majorinfo.ID ?? ""; + } + + } + //是否强密码验证 + bool pwd = false; + if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["verifypwd"]) && ConfigurationManager.AppSettings["verifypwd"] == "true" && loginModel.up == false) + { + pwd = true; + } + else + { + //保存用户设备号 + userIbll.UpdateWeixinOpenId(userEntity.F_UserId, loginModel.openid); + } + var jsonData = new + { + baseinfo = res.userInfo, + post = postIBLL.GetListByPostIds(res.userInfo.postIds), + role = roleIBLL.GetListByRoleIds(res.userInfo.roleIds), + pwd = pwd + }; + return Success(jsonData); + } + #endregion + } + public Response GetWeixinWebaccess_token(dynamic _) { var entity = weChatConfigIbll.GetEnableEntity(); diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/XmlConfig/system.config b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/XmlConfig/system.config index 0fac6f538..39f36d613 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/XmlConfig/system.config +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/XmlConfig/system.config @@ -66,6 +66,7 @@ + diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/packages.config b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/packages.config index b9d939563..05bbc23ba 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/packages.config +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/packages.config @@ -30,6 +30,7 @@ + \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeBLL.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeBLL.cs index 1e3296b7e..778209e76 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeBLL.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeBLL.cs @@ -551,7 +551,91 @@ namespace Learun.Application.Form } } } - + + public Dictionary GetFolderKey(string schemeInfoId, string processIdName, string keyValue) + { + Dictionary res = new Dictionary(); + + try + { + FormSchemeInfoEntity formSchemeInfoEntity = GetSchemeInfoEntity(schemeInfoId); + FormSchemeEntity formSchemeEntity = GetSchemeEntity(formSchemeInfoEntity.F_SchemeId); + FormSchemeModel formSchemeModel = formSchemeEntity.F_Scheme.ToObject(); + + // 确定主从表之间的关系 + List> TableTree = new List>();// 从表 + foreach (var table in formSchemeModel.dbTable) + { + TreeModelEx treeone = new TreeModelEx(); + treeone.data = table; + treeone.id = table.name; + treeone.parentId = table.relationName; + if (string.IsNullOrEmpty(table.relationName)) + { + treeone.parentId = "0"; + } + TableTree.Add(treeone); + } + TableTree = TableTree.ToTree(); + + // 确定表与组件之间的关系 + Dictionary> tableComponts = new Dictionary>(); + foreach (var tab in formSchemeModel.data) + { + foreach (var compont in tab.componts) + { + if (!string.IsNullOrEmpty(compont.table)) + { + if (!tableComponts.ContainsKey(compont.table)) + { + tableComponts[compont.table] = new List(); + } + if (compont.type == "upload") + { + tableComponts[compont.table].Add(compont); + } + if (compont.type == "guid") + { + tableComponts[compont.table].Add(compont); + } + + } + } + } + GetInstanceTableData(TableTree, tableComponts, formSchemeModel.dbId, keyValue, processIdName, null, res); + Dictionary < string,string> uploadfieldkeyvalue=new Dictionary(); + foreach (var itemCompont in tableComponts) + { + foreach (FormCompontModel formitem in itemCompont.Value) + { + if (formitem.type=="upload") + { + foreach (var resitem in res) + { + if (resitem.Value.Rows.Count>0) + { + if (resitem.Value.Rows[0][formitem.field] != null) + uploadfieldkeyvalue.Add(formitem.id, resitem.Value.Rows[0][formitem.field].ToString()); + } + } + } + } + } + return uploadfieldkeyvalue; + } + catch (Exception ex) + { + if (ex is ExceptionEx) + { + throw; + } + else + { + throw ExceptionEx.ThrowBusinessException(ex); + } + } + } + /// /// 保存自定义表单数据 /// diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeIBLL.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeIBLL.cs index 571d48c9d..72444597a 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeIBLL.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.Form/Scheme/FormSchemeIBLL.cs @@ -137,5 +137,7 @@ namespace Learun.Application.Form /// 数据主键值 void DeleteInstanceForm(string schemeInfoId, string keyValue); #endregion + + Dictionary GetFolderKey(string itemSchemeInfoId, string itemProcessIdName, string itemKeyValue); } } diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/StuInfoBasic_PayFee/StuInfoBasic_PayFeeEntity.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/StuInfoBasic_PayFee/StuInfoBasic_PayFeeEntity.cs index 1714c2271..a2fc7c44e 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/StuInfoBasic_PayFee/StuInfoBasic_PayFeeEntity.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/StuInfoBasic_PayFee/StuInfoBasic_PayFeeEntity.cs @@ -62,7 +62,7 @@ namespace Learun.Application.TwoDevelopment.EducationalAdministration [NotMapped] public string StuCode { get; set; } [NotMapped] public string StuName { get; set; } - [NotMapped] public string GenderNo { get; set; } + [NotMapped] public bool? GenderNo { get; set; } [NotMapped] public string IdentityCardNo { get; set; } [NotMapped] public string DeptNo { get; set; } [NotMapped] public string MajorNo { get; set; } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/.hbuilderx/launch.json b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/.hbuilderx/launch.json index b9c0a3291..34b613be0 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/.hbuilderx/launch.json +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/.hbuilderx/launch.json @@ -10,6 +10,10 @@ { "launchtype" : "remote" }, + "mp-weixin" : + { + "launchtype" : "remote" + }, "type" : "uniCloud" } ] diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue index 55e9bb57a..46d92c1be 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue @@ -10,7 +10,7 @@ // H5 刷新时获取当前页面路径 const pagePath = "/" + param.path; // 如果 H5 刷新后访问的不是首页/登录页/注册页,直接跳转回首页 - if (!["/pages/login", "/pages/home", "/pages/signup"].includes(pagePath)) { + if (!["/pages/login", "/pages/weixinLogin","/pages/home", "/pages/signup","/pages/my/newpassword"].includes(pagePath)) { this.$nextTick(() => { this.TAB_TO("/pages/home"); return; diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/customform.js b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/customform.js index 4a171f0b1..55fe2542c 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/customform.js +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/customform.js @@ -24,274 +24,310 @@ import moment from 'moment' */ export default { - methods: { - /** - * 获取一个 scheme 表单项的源数据 (加载表单时使用) - * 参数: 单个 schemeItem - * - * radio、select、checkbox、layer 这四种表单项,需要加载额外的选单数据 - * 选单数据有两种获取方式: - * 1、来自数据字典: - * 数据字典在 this.GET_GLOBAL('dataDictionary') - * 表单使用的字段在 schemeItem.itemCode - * 选单数据中的 text 字段作为显示, value 字段作为值 - * - * 2、来自数据源: - * 将 schemeItem.dataSourceId 按符号「,」逗号分割为数组,分割为: [code, displayField, valueField] - * 数据源需要请求 API 来获取,请求需要带上数据源的编号 code - * displayField、valueField 分别为展示字段和值绑定字段 - * - * 选单数据有两种格式: - * 1、对于 radio、select、checkbox 来说: - * 只需要一个数组,数组形如: [{ text: '选项文字', value: '选项值' }, ...] - * 将获取的数据绑定到组件的 range 属性上即可 - * 全局数据中默认是对象形式,使用 Object.values() 转化即可 - * - * 2、对于 layer 来说: - * 返回一个对象,形如 { source, layerData, selfField } - * source: 为弹层中列出的数据,是一个数组 - * layerData: 需要在弹层窗口中展示的字段及标题文字,形如: [{ name:'要展示的字段名', label:'标题文字' }] - * selfField: 该表单值绑定哪个字段,默认为绑定到自身的字段 - */ - async getSourceData(schemeItem) { - if (['radio', 'select', 'checkbox'].includes(schemeItem.type)) { - // radio select checkbox 三种情况 - if (!schemeItem.dataSource || Number(schemeItem.dataSource) === 0) { - // dataSource 为 0,使用 clientData - return Object - .values(this.GET_GLOBAL('dataDictionary')[schemeItem.itemCode]) - .map(t => ({ value: t.value, text: t.text })) - - } else { - // dataSource 不为 0,使用数据源,需要请求接口,并且提取出显示字段和实际字段 - const [code, displayField = schemeItem.showField, valueField = schemeItem.saveField] = schemeItem.dataSourceId - .split(',') - const sourceData = await this.FETCH_DATASOURCE(code) - if (!sourceData) { return [] } - - return sourceData.data.map(t => ({ text: t[displayField], value: t[valueField] })) - } - - } else if (['layer'].includes(schemeItem.type)) { - // layer 需要更多属性 - if (!schemeItem.dataSource || Number(schemeItem.dataSource) === 0) { - // dataSource 为 0,使用 clientData - // clientData 对象转数组后,隐含 key:item.text 和 value:item.value 的关系 - const [keyItem, valueItem] = schemeItem.layerData - const source = Object - .values(this.GET_GLOBAL('dataDictionary')[schemeItem.itemCode]) - .map(t => ({ value: t.value, text: t.text })) - - return { - source, - layerData: [ - { name: 'text', label: keyItem.label || '', value: keyItem.value || '' }, - { name: 'value', label: valueItem.label || '', value: valueItem.value || '' } - ] - } - } else { - // dataSource 不为 0,使用数据源,需要请求接口,并且提取出显示字段和实际字段 - const [code] = schemeItem.dataSourceId.split(',') - const sourceData = await this.FETCH_DATASOURCE(code) - if (!sourceData) { return [] } - - const source = sourceData.data - - return { source, layerData: schemeItem.layerData.filter(t => (!t.hide) && (t.value || t.label)) } - } - } - - return [] - }, - - /** - * 获取一个 scheme 表单项的默认值 (用户新建表单时使用,或是编辑草稿) - * 参数: 单个 schemeItem , { processId } - * - * 每种类别的表单项分别获取的默认值: - * - * currentInfo: 根据类别取当前用户/部门/公司/时间日期 - * datetime: 根据 dfValue 字段表示昨天/今天/明天,格式化为字符串 - * radio、select: 有 dfValue 则使用,否则取第一条 - * checkbox: 有 dfValue 则使用,否则为空数组 - * encode: 根据 rulecode 请求表单编码 - * upload: 空数组 - * guid: 赋值第二个参数中的 processId,但是如果在子表格中,赋空字符串 - * girdtable: 递归所有表格项 scheme 依次为它们生成默认值 - * datetimerange: 字符串 0 - */ - async getDefaultData(item, prop) { - const { processId } = prop - switch (item.type) { - case 'currentInfo': - switch (item.dataType) { - case 'user': - return this.GET_GLOBAL('loginUser').userId - case 'department': - return this.GET_GLOBAL('loginUser').departmentId - case 'company': - return this.GET_GLOBAL('loginUser').companyId - case 'time': - return moment().format('YYYY-MM-DD HH:mm:ss') - default: - return '' - } - - case 'datetime': - const datetimeFormat = item.table ? - (Number(item.dateformat) === 0 ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss') : - (item.datetime === 'datetime' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD') - const today = moment() - const dfDatetime = [ - today.subtract(1, 'day'), - today, - today.add(1, 'day') - ][Number(item.dfvalue)] || today - - return dfDatetime.format(datetimeFormat) || '' - - case 'radio': - case 'select': - const radioItem = item.__sourceData__.find(t => t.value === item.dfvalue) || item.__sourceData__[0] - return item.type === 'radio' ? radioItem.value : '' - - case 'checkbox': - if (!item.dfvalue) { - return [] - } - return item.dfvalue.split(',').filter(t => item.__sourceData__.find(s => s.value === t)) - - case 'encode': - const result = await this.FETCH_ENCODE(item.rulecode) - return result - - case 'upload': - return [] - - case 'guid': - return item.table ? processId : '' - - case 'girdtable': - const tableItemObj = {} - for (const fieldItem of item.fieldsData) { - tableItemObj[fieldItem.field] = await this.getDefaultData(fieldItem, prop) - } - return this.COPY(tableItemObj) - - case 'datetimerange': - return '0' - - default: - return item.dfvalue || '' - } - }, - - /** - * 将单条 formData 值转化为 formValue 值 (拉取表单数据时使用) - * 参数: 单个 schemeItem , 数据值 - * - * 具体执行逻辑: - * radio、select: 剔除无效值 - * checkbox: 分割成数组并剔除无效值 - * upload: 分割成数组,拉取其中所有文件的信息 - * datetime: 按照时间日期格式进行格式化字符串 - * 其他类型: 保留原值 - */ - async convertToFormValue(item, val) { - switch (item.type) { - case 'upload': - if (!val) { return [] } - const uidList = val.split(',') - const fileList = [] - - for (const uid of uidList || []) { - const fileInfo = await this.FETCH_FILEINFO(uid) - if (!fileInfo) { continue } - - const fileType = fileInfo.F_FileType - const fileSize = fileInfo.F_FileSize - - const path = this.API + '/learun/adms/annexes/wxdown?' + this.URL_QUERY(uid, true) - - fileList.push({ path, type: fileType, uid, size: fileSize }) - } - return fileList - - case 'select': - case 'radio': - if (!val || !item.__sourceData__.map(t => t.value).includes(val)) { - return '' - } - return val - - case 'checkbox': - const validValue = item.__sourceData__.map(t => t.value) - const checkboxVal = val.split(',') || [] - return checkboxVal.filter(t => validValue.includes(t)) - - case 'datetime': - if (!val) { - return '' - } - return moment(val).format( - Number(item.dateformat) === 0 || item.datetime === 'date' ? - 'YYYY-MM-DD' : - 'YYYY-MM-DD HH:mm:ss' - ) - - default: - return val || '' - } - }, - - /** - * 将一个 formValue 值转化为 post 提交值(提交表单数据时使用) - * 参数: 单个 schemeItem , 表单项值 , 所有 formValue , scheme - * - * 具体执行逻辑: - * checkbox: 将数组使用符号「,」逗号拼接成字符串 - * datetimerange: 获取开始日期、结束日期,计算差值天数并保留整数 - * datetime: 格式化为完整时间日期字符串 - * upload: 依次上传文件,将返回的文件 ID 使用符号「,」逗号拼接成字符串 - * 其他类型: 保留原值 - */ - async convertToPostData(item, val, formValue, scheme) { - switch (item.type) { - case 'checkbox': - return val ? val.join(',') : '' - - case 'datetimerange': - const startTime = get(formValue, scheme.find(t => t.id === item.startTime).__valuePath__, null) - const endTime = get(formValue, scheme.find(t => t.id === item.endTime).__valuePath__, null) - if (!startTime || !endTime || moment(endTime).isBefore(startTime)) { - return '' - } else { - return moment.duration(moment(endTime).diff(moment(startTime))).asDays().toFixed(0) - } - - case 'datetime': - return val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : '' - - case 'upload': - const uploadUid = [] - // { path, uid } - for (const item of val) { - if (item.uid) { - uploadUid.push(item.uid) - continue - } - - const fileId = await this.HTTP_UPLOAD(item.path||item) - if (fileId) { - uploadUid.push(fileId) - } - } - - return uploadUid.join(',') - - default: - return val || '' - } - } - } + methods: { + /** + * 获取一个 scheme 表单项的源数据 (加载表单时使用) + * 参数: 单个 schemeItem + * + * radio、select、checkbox、layer 这四种表单项,需要加载额外的选单数据 + * 选单数据有两种获取方式: + * 1、来自数据字典: + * 数据字典在 this.GET_GLOBAL('dataDictionary') + * 表单使用的字段在 schemeItem.itemCode + * 选单数据中的 text 字段作为显示, value 字段作为值 + * + * 2、来自数据源: + * 将 schemeItem.dataSourceId 按符号「,」逗号分割为数组,分割为: [code, displayField, valueField] + * 数据源需要请求 API 来获取,请求需要带上数据源的编号 code + * displayField、valueField 分别为展示字段和值绑定字段 + * + * 选单数据有两种格式: + * 1、对于 radio、select、checkbox 来说: + * 只需要一个数组,数组形如: [{ text: '选项文字', value: '选项值' }, ...] + * 将获取的数据绑定到组件的 range 属性上即可 + * 全局数据中默认是对象形式,使用 Object.values() 转化即可 + * + * 2、对于 layer 来说: + * 返回一个对象,形如 { source, layerData, selfField } + * source: 为弹层中列出的数据,是一个数组 + * layerData: 需要在弹层窗口中展示的字段及标题文字,形如: [{ name:'要展示的字段名', label:'标题文字' }] + * selfField: 该表单值绑定哪个字段,默认为绑定到自身的字段 + */ + async getSourceData(schemeItem) { + if (['radio', 'select', 'checkbox'].includes(schemeItem.type)) { + // radio select checkbox 三种情况 + if (!schemeItem.dataSource || Number(schemeItem.dataSource) === 0) { + // dataSource 为 0,使用 clientData + return Object + .values(this.GET_GLOBAL('dataDictionary')[schemeItem.itemCode]) + .map(t => ({ + value: t.value, + text: t.text + })) + + } else { + // dataSource 不为 0,使用数据源,需要请求接口,并且提取出显示字段和实际字段 + const [code, displayField = schemeItem.showField, valueField = schemeItem.saveField] = + schemeItem.dataSourceId + .split(',') + const sourceData = await this.FETCH_DATASOURCE(code) + if (!sourceData) { + return [] + } + + return sourceData.data.map(t => ({ + text: t[displayField], + value: t[valueField] + })) + } + + } else if (['layer'].includes(schemeItem.type)) { + // layer 需要更多属性 + if (!schemeItem.dataSource || Number(schemeItem.dataSource) === 0) { + // dataSource 为 0,使用 clientData + // clientData 对象转数组后,隐含 key:item.text 和 value:item.value 的关系 + const [keyItem, valueItem] = schemeItem.layerData + const source = Object + .values(this.GET_GLOBAL('dataDictionary')[schemeItem.itemCode]) + .map(t => ({ + value: t.value, + text: t.text + })) + + return { + source, + layerData: [{ + name: 'text', + label: keyItem.label || '', + value: keyItem.value || '' + }, + { + name: 'value', + label: valueItem.label || '', + value: valueItem.value || '' + } + ] + } + } else { + // dataSource 不为 0,使用数据源,需要请求接口,并且提取出显示字段和实际字段 + const [code] = schemeItem.dataSourceId.split(',') + const sourceData = await this.FETCH_DATASOURCE(code) + if (!sourceData) { + return [] + } + + const source = sourceData.data + + return { + source, + layerData: schemeItem.layerData.filter(t => (!t.hide) && (t.value || t.label)) + } + } + } + + return [] + }, + + /** + * 获取一个 scheme 表单项的默认值 (用户新建表单时使用,或是编辑草稿) + * 参数: 单个 schemeItem , { processId } + * + * 每种类别的表单项分别获取的默认值: + * + * currentInfo: 根据类别取当前用户/部门/公司/时间日期 + * datetime: 根据 dfValue 字段表示昨天/今天/明天,格式化为字符串 + * radio、select: 有 dfValue 则使用,否则取第一条 + * checkbox: 有 dfValue 则使用,否则为空数组 + * encode: 根据 rulecode 请求表单编码 + * upload: 空数组 + * guid: 赋值第二个参数中的 processId,但是如果在子表格中,赋空字符串 + * girdtable: 递归所有表格项 scheme 依次为它们生成默认值 + * datetimerange: 字符串 0 + */ + async getDefaultData(item, prop) { + const { + processId + } = prop + switch (item.type) { + case 'currentInfo': + switch (item.dataType) { + case 'user': + return this.GET_GLOBAL('loginUser').userId + case 'department': + return this.GET_GLOBAL('loginUser').departmentId + case 'company': + return this.GET_GLOBAL('loginUser').companyId + case 'time': + return moment().format('YYYY-MM-DD HH:mm:ss') + default: + return '' + } + + case 'datetime': + const datetimeFormat = item.table ? + (Number(item.dateformat) === 0 ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss') : + (item.datetime === 'datetime' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD') + const today = moment() + const dfDatetime = [ + today.subtract(1, 'day'), + today, + today.add(1, 'day') + ][Number(item.dfvalue)] || today + + return dfDatetime.format(datetimeFormat) || '' + + case 'radio': + case 'select': + const radioItem = item.__sourceData__.find(t => t.value === item.dfvalue) || item + .__sourceData__[0] + return item.type === 'radio' ? radioItem.value : '' + + case 'checkbox': + if (!item.dfvalue) { + return [] + } + return item.dfvalue.split(',').filter(t => item.__sourceData__.find(s => s.value === t)) + + case 'encode': + const result = await this.FETCH_ENCODE(item.rulecode) + return result + + case 'upload': + return [] + + case 'guid': + return item.table ? processId : '' + + case 'girdtable': + const tableItemObj = {} + for (const fieldItem of item.fieldsData) { + tableItemObj[fieldItem.field] = await this.getDefaultData(fieldItem, prop) + } + return this.COPY(tableItemObj) + + case 'datetimerange': + return '0' + + default: + return item.dfvalue || '' + } + }, + + /** + * 将单条 formData 值转化为 formValue 值 (拉取表单数据时使用) + * 参数: 单个 schemeItem , 数据值 + * + * 具体执行逻辑: + * radio、select: 剔除无效值 + * checkbox: 分割成数组并剔除无效值 + * upload: 分割成数组,拉取其中所有文件的信息 + * datetime: 按照时间日期格式进行格式化字符串 + * 其他类型: 保留原值 + */ + async convertToFormValue(item, val) { + switch (item.type) { + case 'upload': + if (!val) { + return [] + } + const uidList = val; + const fileList = [] + const wxlist = await this.FETCH_FILEList(uidList); + for (const wxfile of wxlist) { + const fileInfo = await this.FETCH_FILEINFO(wxfile.F_Id) + if (!fileInfo) { + continue + } + + const fileType = fileInfo.F_FileType + const fileSize = fileInfo.F_FileSize + + const path = this.API + '/learun/adms/annexes/wxdown?' + this.URL_QUERY(wxfile.F_Id, true) + fileList.push({ + path, + type: fileType, + uid:wxfile.F_Id, + folderId:wxfile.F_FolderId, + size: fileSize + }) + } + return fileList + + case 'select': + case 'radio': + if (!val || !item.__sourceData__.map(t => t.value).includes(val)) { + return '' + } + return val + + case 'checkbox': + const validValue = item.__sourceData__.map(t => t.value) + const checkboxVal = val.split(',') || [] + return checkboxVal.filter(t => validValue.includes(t)) + + case 'datetime': + if (!val) { + return '' + } + return moment(val).format( + Number(item.dateformat) === 0 || item.datetime === 'date' ? + 'YYYY-MM-DD' : + 'YYYY-MM-DD HH:mm:ss' + ) + + default: + return val || '' + } + }, + + /** + * 将一个 formValue 值转化为 post 提交值(提交表单数据时使用) + * 参数: 单个 schemeItem , 表单项值 , 所有 formValue , scheme + * + * 具体执行逻辑: + * checkbox: 将数组使用符号「,」逗号拼接成字符串 + * datetimerange: 获取开始日期、结束日期,计算差值天数并保留整数 + * datetime: 格式化为完整时间日期字符串 + * upload: 依次上传文件,将返回的文件 ID 使用符号「,」逗号拼接成字符串 + * 其他类型: 保留原值 + */ + async convertToPostData(item, val, formValue, scheme, guid) { + switch (item.type) { + case 'checkbox': + return val ? val.join(',') : '' + + case 'datetimerange': + const startTime = get(formValue, scheme.find(t => t.id === item.startTime).__valuePath__, null) + const endTime = get(formValue, scheme.find(t => t.id === item.endTime).__valuePath__, null) + if (!startTime || !endTime || moment(endTime).isBefore(startTime)) { + return '' + } else { + return moment.duration(moment(endTime).diff(moment(startTime))).asDays().toFixed(0) + } + + case 'datetime': + return val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : '' + + case 'upload': + var uploadUid = ''; + + for (const item of val) { + if (item.uid) { + uploadUid = item.uid + continue + } + + const fileId = await this.HTTP_UPLOAD(item.path || item, undefined, guid || '') + if (fileId) { + uploadUid = fileId; + } + } + + return uploadUid; + + default: + return val || '' + } + } + } } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/custompage.js b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/custompage.js index b48efc4f9..786db8dc0 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/custompage.js +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/custompage.js @@ -1,3 +1,4 @@ +import { conforms } from 'lodash' import get from 'lodash/get' import omit from 'lodash/omit' import moment from 'moment' @@ -233,7 +234,11 @@ export default { } else { for (const [fieldName, scheme] of Object.entries(schemeItem)) { const dataSource = get(this.dataSource, `${tableName}.${fieldName}`) - data[tableName][fieldName] = await this.convertToFormValue(scheme, data[tableName][fieldName], dataSource) + if(data[tableName]){ + data[tableName][fieldName] = await this.convertToFormValue(scheme, data[tableName][fieldName], dataSource) + }else{ + this.scheme[tableName][fieldName] = await this.convertToFormValue(scheme, this.scheme[tableName][fieldName], dataSource) + } } } } @@ -257,7 +262,6 @@ export default { const fileSize = fileInfo.F_FileSize const path = this.API + '/learun/adms/annexes/wxdown?' + this.URL_QUERY(uid, true) - fileList.push({ path, type: fileType, uid, size: fileSize }) } return fileList diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/mixins.js b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/mixins.js index a796f6dac..c33aa8c52 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/mixins.js +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/common/mixins.js @@ -229,6 +229,14 @@ export default { return await this.HTTP_GET('learun/adms/annexes/wxfileinfo', fileId) }, + //获取文件夹下文件列表 + async FETCH_FILEList(folderId) { + if (!folderId) { + return null + } + + return await this.HTTP_GET('learun/adms/annexes/wxlist', folderId) + }, // 封装的 GET 请求,集成了验证信息 // 返回请求结果或 null @@ -258,8 +266,8 @@ export default { // url 为请求地址 // filePath 为临时文件的路径 // formData 为请求附带的提交数据 - async HTTP_UPLOAD(filePath, formData) { - const [err, res] = await this.UPLOAD('/learun/adms/annexes/wxupload', filePath, formData) + async HTTP_UPLOAD(filePath, formData,guid) { + const [err, res] = await this.UPLOAD('/learun/adms/annexes/wxupload', filePath, formData,guid) return this.handleResult(err, res) }, @@ -308,11 +316,12 @@ export default { // 返回结果是一个数组: [error, result] // error 表示错误,一般是网络错误,请求很可能根本没有发出 // result 包含 { statusCode, data } 分别表示状态码、接口返回的数据 - async UPLOAD(url, filePath, formData) { + async UPLOAD(url, filePath, formData,guid) { const uploadUrl = this.handleUrl(url) const query = { loginMark: this.getLoginMark(), - token: this.GET_GLOBAL('token') + token: this.GET_GLOBAL('token'), + folderId:guid } if (formData && typeof formData === 'object') { @@ -683,13 +692,13 @@ export default { if(result.data.code != 200){ uni.hideLoading() uni.showToast({ - title: tips||result.data.info||"未知错误", + title: result.data.info, icon: 'none' }) return null } - return result.data.data||true + return result.data.data }, // 【即将废弃】请使用 this.CONFIG() 来替代 diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/customform.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/customform.vue index 9ff9a6f73..3dafa1ce7 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/customform.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/customform.vue @@ -194,12 +194,14 @@ export default { // 依次验证表单项,返回一个所有错误提示的数组,如果为空数组则表示无错误 verifyValue() { const errorList = [] - + console.log(this.scheme) this.scheme .filter(t => t.verify) .forEach(schemeItem => { if (schemeItem.table && schemeItem.field) { + console.log(schemeItem.verify,'hemeItem.verify') const verifyFunc = this.verify[schemeItem.verify] + console.log(schemeItem.verify) const verifyResult = verifyFunc(this.getValue(schemeItem.__valuePath__)) if (verifyResult !== true) { errorList.push(`[${schemeItem.title}]: ${verifyResult}`) @@ -304,7 +306,8 @@ export default { MobileOrPhoneOrNull: t => t.length <= 0 || /^1[0-9]{10}$/.test(t) || /^[+0-9- ]*$/.test(t) || '须留空或符合手机/电话号码格式', Uri: t => /^[a-zA-z]+:\/\/[^\s]*$/.test(t) || '须符合网址Url格式', - UriOrNull: t => t.length <= 0 || /^[a-zA-z]+:\/\/[^\s]*$/.test(t) || '须留空或符合网址Url格式' + UriOrNull: t => t.length <= 0 || /^[a-zA-z]+:\/\/[^\s]*$/.test(t) || '须留空或符合网址Url格式', + PositiveFloatint:t=> /^([1-9]\d*|(0|[1-9]\d*)\.\d*[1-9])$/.test(t) || '请输入正确的整数或小数(不能为零和负数)' } } } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/upload-file.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/upload-file.vue index 969f835be..e2300312a 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/upload-file.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/learun-app/upload-file.vue @@ -89,7 +89,7 @@ export default { // #endif // #ifndef MP-DINGTALK - uni.chooseImage({ + uni.chooseFile({ count: Number(this.number), sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/upload-file.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/upload-file.vue index 6927690a6..f3947f199 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/upload-file.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/upload-file.vue @@ -1,296 +1,293 @@ \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/EducationalAdministration/Thermography/measure/list.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/EducationalAdministration/Thermography/measure/list.vue index 72b52976c..c227fb63f 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/EducationalAdministration/Thermography/measure/list.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/EducationalAdministration/Thermography/measure/list.vue @@ -508,6 +508,7 @@ export default{ text-align: center; font-size: 14px; color: #1a1a1a; + background-color: #ffffff; } .timeTableAlertLi.active { @@ -518,10 +519,6 @@ export default{ background-color: #fbfdff; } -.timeTableAlertLi:nth-child(2n - 1) { - background-color: #ffffff; -} - #MeasureTime { text-align: center; } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue index 93c2abbfc..a6170c951 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue @@ -273,7 +273,7 @@ page { .otherLogin{ display: flex; - justify-content: right; + justify-content: flex-end; .textBtn{ width: 100px; color: #606266; diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg.vue index bd59cb137..58981285d 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg.vue @@ -132,7 +132,7 @@ export default { return null } - return this.API + `/user/img?data=${item.F_OtherUserId}` + return this.API + `/learun/adms/user/img?data=${item.F_OtherUserId}` } }, diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg/chat.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg/chat.vue index 1b8e6bd8a..0cebe305f 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg/chat.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/msg/chat.vue @@ -186,7 +186,7 @@ export default { // 获取用户头像图片 url avatar(id) { - return id === this.chatUserId && this.isSystem ? null : this.API + `/user/img?data=${id}` + return id === this.chatUserId && this.isSystem ? null : this.API + `/learun/adms/user/img?data=${id}` } }, diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue index 0ae3c6381..7774d7de3 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue @@ -156,7 +156,7 @@ export default { return '' } - return this.API + `/user/img?data=${this.currentUser.userId}` + return this.API + `/learun/adms/user/img?data=${this.currentUser.userId}` } }, diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/info.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/info.vue index 1b87fb850..93b978381 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/info.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/info.vue @@ -34,7 +34,7 @@ export default { // 头像图片 url avatarSrc() { - return this.API + `/user/img?data=${this.currentUser.userId}` + return this.API + `/learun/adms/user/img?data=${this.currentUser.userId}` } } } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/qrcode.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/qrcode.vue index 272bde806..3297a7881 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/qrcode.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/qrcode.vue @@ -30,7 +30,7 @@ export default { // 头像图片 url avatar() { - return this.API + `/user/img?data=${this.currentUser.userId}` + return this.API + `/learun/adms/user/img?data=${this.currentUser.userId}` }, // 用户公司部门 tag diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/myAttendance/single.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/myAttendance/single.vue index db1c4bdef..a6e26cce8 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/myAttendance/single.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/myAttendance/single.vue @@ -38,7 +38,7 @@ - + {{ k.Sort }} diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/myflow/single.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/myflow/single.vue index f4f45cbed..eca58e1be 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/myflow/single.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/myflow/single.vue @@ -95,14 +95,15 @@ export default { // t.formId 使用表单,根据这个 formId 来获取 scheme 等信息 // t.appurl 使用移动页面,直接跳转到本地的页面;表单结构等均写死在页面里 const { wfForms } = this.currentNode - console.log(wfForms); - // 处理没有有效表单的情况,停止加载 if (!wfForms || wfForms.every(t => !t.formId && !t.appurl)) { this.HIDE_LOADING() this.TOAST('移动表单数据(wfForms)中无有效表单') return } + + const fetchFolderkeyData=await this.fetchFolderkeyData(this.currentNode , this.processId); + uni.setStorageSync('guids',JSON.stringify(fetchFolderkeyData)); // 处理移动端本地表单(也就是系统表单)的情况,直接跳转过去 const appSysPage = wfForms.find(t => t.appurl) @@ -151,8 +152,6 @@ export default { // 不是子流程,可以直接渲染 const schemeData = await this.fetchSchemeData(this.currentNode) const formData = await this.fetchFormData(this.currentNode, this.processId) - console.log(schemeData) - console.log(formData) const { formValue, scheme, rel } = await this.getCustomForm({ formData, schemeData, @@ -161,7 +160,6 @@ export default { code: null }) this.scheme = scheme - console.log(scheme) this.formValue = formValue this.rel = rel } @@ -201,7 +199,7 @@ export default { return } this.LOADING(`提交${actionText}中…`) - this.HTTP_POST(`/newwf${actionUrl}`, actionData, `提交${actionText}失败`).then(success => { + this.HTTP_POST(`/learun/adms/newwf${actionUrl}`, actionData, `提交${actionText}失败`).then(success => { this.HIDE_LOADING() if (success) { this.EMIT('task-list-change') @@ -220,7 +218,7 @@ export default { this.LOADING('正在提交…') const draftFormValue = this.$refs.form.getFormValue() const draftPostData = await this.getPostData(draftFormValue, this.scheme) - this.HTTP_POST('/newwf​/draft', draftPostData, '提交草稿失败').then(success => { + this.HTTP_POST('/learun/adms/newwf/draft', draftPostData, '提交草稿失败').then(success => { this.HIDE_LOADING() if (success) { this.EMIT('task-list-change') @@ -249,7 +247,7 @@ export default { postData.parentTaskId = this.taskId } const errorTips = '流程发起失败' - this.HTTP_POST('/newwf/createchildflow', postData, errorTips).then(success => { + this.HTTP_POST('/learun/adms/newwf/createchildflow', postData, errorTips).then(success => { this.HIDE_LOADING() if (success) { this.EMIT('task-list-change') diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/releasetask/single.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/releasetask/single.vue index 7691f9422..f8269c91d 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/releasetask/single.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/releasetask/single.vue @@ -110,7 +110,10 @@ export default { this.needTitle = this.type !== 'again' && Number(currentNode.isTitle) === 1 const formData = await this.fetchFormData(currentNode, processId) - const schemeData = await this.fetchSchemeData(currentNode) + + const schemeData = await this.fetchSchemeData(currentNode); + const fetchFolderkeyData=await this.fetchFolderkeyData(currentNode, processId); + uni.setStorageSync('guids',JSON.stringify(fetchFolderkeyData)); const { formValue, scheme, rel } = await this.getCustomForm({ schemeData, processId, @@ -119,14 +122,15 @@ export default { code: this.type === 'again' ? null : code, useDefault: true }) + this.rel = rel this.scheme = scheme this.formValue = formValue this.code = code this.processId = processId - this.ready = true this.HIDE_LOADING() + }, // 提交草稿按钮 @@ -153,9 +157,10 @@ export default { // 发起流程按钮 async submit() { const isAgain = this.type === 'again' - + // 先验证表单,验证不通过则提示 const verifyResult = this.verifyValue() + if (verifyResult.length > 0) { this.CONFIRM('表单验证失败', verifyResult.join('\n')) return @@ -191,6 +196,7 @@ export default { // 获取表单验证结果,是一个包含错误信息的数组,长度为 0 则没有错误 verifyValue() { + const errList = this.$refs.form.verifyValue() if (this.needTitle && !this.title) { errList.push(`流程的标题不能为空`) diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/workflow.js b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/workflow.js index c3689c50f..d53429cf3 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/workflow.js +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/nworkflow/workflow.js @@ -32,298 +32,383 @@ import customForm from '@/common/customform.js' * (以上只是简单介绍;实际使用中,如果打开子流程,需要拉取父/子两个流程信息) */ export default { - mixins: [customForm], - - methods: { - /** - * 从流程信息中生成 scheme、formValue - * 参数: { schemeData (必填), processId, currentNode, formData (新建时为 null), code, useDefault } - * 返回: { scheme, formValue, rel } - * - * 参数: - * schemeData: 使用 fetchSchemeData 方法拉取到的原始 scheme 数据,未经过格式化处理 - * processId: 表单 GUID;如果是新建表单,可以用 this.GUID('-') 生成一个 - * currentNode: 使用 getCurrentNode 方法拉取到的当前节点信息,用于权限控制 - * formData: 填入表单的表单值,新建表单时此项为 null 即可 - * code: 表单编号 code,会被赋值到返回的 formValue.code;重新发起流程的场合赋 null - * useDefault: 如果 formData 中某一项为空,是否对这一项填入默认值;通常在编辑草稿时启用 - * - * 该方法返回的 scheme 项可能带有以下属性: - * __valuePath__: 表单值在 formValue 中的路径,使用 lodash 的 get、set 方法即可读写 - * __sourceData__: 表单值的选单数据 - * __defaultItem__: 类型为 girdtable 的表单项带有此属性,表示添加一行表格时候表格项的默认值 - * __schemeIndex__: (暂时用不到)表单项位于 schemeData 根级内的第几个子项中 - * __dataIndex__: (暂时用不到)表单项位于 F_Scheme.data 中的第几个子项中 - */ - async getCustomForm(prop) { - const { schemeData, formData, currentNode, code, processId, useDefault } = prop - - // 处理字段之间的级联、绑定关系 - // 需要绑定 change 事件的: - // datetime: 修改后重新计算 datetimerange - // organize: 修改后重设级联到该组件的其他组件的值,user 一级无需处理 - // 需要绑定某值的: - // organize: 级联到某个组件,company 一级无需处理 - const schemeRef = {} - const refList = [] - - // 最终返回值:scheme、rel、formValue - const scheme = [] - const rel = {} - const formValue = { processId, formreq: [] } - if (code) { - formValue.code = code - } - - // 遍历 schemeData 中所有的 scheme - const schemeList = Array.isArray(schemeData) ? schemeData : Object.values(schemeData) - for (let schemeIndex = 0; schemeIndex < schemeList.length; ++schemeIndex) { - const schemeItem = schemeList[schemeIndex] - schemeItem.F_Scheme = JSON.parse(schemeItem.F_Scheme) - // 已有表单值的时候,舍弃掉不存在表单值中的 scheme - if (formData && !formData[schemeItem.F_SchemeInfoId]) { - continue - } - - // 设置 formreq 的内容,非新建模式下需要设置 keyValue - const { formId, field } = get(currentNode, `wfForms.${schemeIndex}`, {}) - const formreqObj = { schemeInfoId: formId, processIdName: field, formData: {} } - if (formData) { - if (Object.values(get(formData, `${schemeItem.F_SchemeInfoId}`, {})).some(t => t && t.length > 0)) { - formreqObj.keyValue = processId - } - } - formValue.formreq[schemeIndex] = formreqObj - - for (let dataIndex = 0; dataIndex < schemeItem.F_Scheme.data.length; ++dataIndex) { - const { componts } = schemeItem.F_Scheme.data[dataIndex] - for (const t of componts) { - // 之后的 t 即表示每个 scheme 项 - t.__valuePath__ = `formreq.${schemeIndex}.formData.${t.id}` - // 以下两个属性暂时用不到 - t.__schemeIndex__ = schemeIndex - t.__dataIndex__ = dataIndex - - if (t.type === 'girdtable' && t.table) { - // 数据项是表格的情况 - // 先设置源数据,不然无法获取默认值 - for (const fieldItem of t.fieldsData) { - fieldItem.__sourceData__ = await this.getSourceData(fieldItem) - } - t.__defaultItem__ = await this.getDefaultData(t, prop) - if (formData) { - // 有表单值的情况,从表单值中获取数据 - const val = [] - for (const valueItem of get(formData, `${schemeItem.F_SchemeInfoId}.${t.table}`, [])) { - const tableItemValue = {} - for (const fieldItem of t.fieldsData.filter(t => t.field)) { - const formDataValue = get(valueItem, fieldItem.field.toLowerCase()) - tableItemValue[fieldItem.field] = await this.convertToFormValue(fieldItem, formDataValue) - } - - val.push(tableItemValue) - } - - // useDefault 表示在从 formData 取不到值的时候使用默认值 - if ((!val || val.length <= 0) && useDefault) { - set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)]) - } else { - set(formValue, t.__valuePath__, val) - } - - } else { - // 无表单值的情况,默认值 - set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)]) - } - - } else if (t.field) { - // 数据项不是表格的情况 - // 先设置源数据,不然无法获取默认值 - t.__sourceData__ = await this.getSourceData(t) - if (formData) { - // 有表单值的情况,从表单值中获取数据 - const path = `${schemeItem.F_SchemeInfoId}.${t.table}.${dataIndex}.${t.field.toLowerCase()}` - const formDataValue = get(formData, path) - - // useDefault 表示在从 formData 取不到值的时候使用默认值 - if (!formDataValue && useDefault) { - set(formValue, t.__valuePath__, await this.getDefaultData(t, prop)) - } else { - set(formValue, t.__valuePath__, await this.convertToFormValue(t, formDataValue)) - } - - } else { - // 无表单值的情况,默认值 - set(formValue, t.__valuePath__, await this.getDefaultData(t, prop)) - } - } - - // 权限控制 - const authObj = get(currentNode, `wfForms.${schemeIndex}.authorize.${t.id}`, {}) - t.edit = authObj.isEdit - if (Number(t.isHide) !== 1 && authObj.isLook !== 0) { - // 加入 scheme - scheme.push(t) - - // organize、datetime 可能作为其他 organize 或 datetimerange 的依赖项,引用它们 - if (['organize', 'datetime'].includes(t.type)) { - schemeRef[t.id] = t - } - - // datetimerange、带有 relation 级联字段的 organize,依赖其他项 - if ((t.type === 'datetimerange' && t.startTime && t.endTime) || (t.type === 'organize' && t.relation)) { - refList.push(t) - } - } - } - } - } - - // 依次处理表单关联 - refList.forEach(t => { - if (t.type === 'organize') { - // 处理组件结构级联 - // 给当前组件赋上级级联的值路径 __relationPath__ - const parent = schemeRef[t.relation] - t.__relationPath__ = parent.__valuePath__ - // 给上级级联的组件注册自动重置当前组件的 change 事件 - const relItem = { type: 'organize', id: t.id, path: t.__valuePath__ } - rel[parent.id] = rel[parent.id] ? rel[parent.id].concat(relItem) : [relItem] - - } else if (t.type === 'datetimerange') { - // 处理日期区间 - const start = schemeRef[t.startTime] - const end = schemeRef[t.endTime] - - const relItem = { - type: 'datetimerange', - path: t.__valuePath__, - id: t.id, - startPath: start.__valuePath__, - endPath: end.__valuePath__, - } - - rel[start.id] = rel[start.id] ? rel[start.id].concat(relItem) : [relItem] - rel[end.id] = rel[end.id] ? rel[end.id].concat(relItem) : [relItem] - - } - }) - - return { scheme, formValue, rel } - }, - - /** - * 获取最终需要 POST 的数据 - * 参数:formValue, scheme - * 返回:用于提交的数据 - * - * 遍历 formValue,将其中的表单值依次使用 convertToPostData 这个方法转化为提交值 - */ - async getPostData(originFormValue, scheme) { - const formValue = this.COPY(originFormValue) - - // 依次按照 scheme 项目遍历 - for (const item of scheme) { - if (item.field) { - // 不是表格的情况 - const path = item.__valuePath__ - const val = get(formValue, path) - const result = await this.convertToPostData(item, val, originFormValue, scheme) - set(formValue, path, result) - - } else if (item.table && item.fieldsData) { - // 是表格的情况 - const tableValue = get(formValue, item.__valuePath__, []) - for (let valueIndex = 0; valueIndex < tableValue.length; ++valueIndex) { - for (const schemeItem of item.fieldsData) { - const path = `${item.__valuePath__}.${valueIndex}.${schemeItem.field}` - const val = get(formValue, path) - const result = await this.convertToPostData(schemeItem, val, originFormValue, scheme) - set(formValue, path, result) - } - } - } - } - - formValue.formreq.forEach(t => { t.formData = JSON.stringify(t.formData) }) - formValue.formreq = JSON.stringify(formValue.formreq) - - return formValue - }, - - /** - * 获取流程信息 - * 参数: { code, processId, taskId } - * - */ - async fetchProcessInfo({ code, processId, taskId }) { - const url = processId ? 'learun/adms/newwf/processinfo' : 'learun/adms/newwf/scheme' - const reqObj = { processId } - if (taskId) { - reqObj.taskId = taskId - } - const data = processId ? reqObj : code - const result = await this.HTTP_GET(url, data) - - if (!result) { return {} } - - if (result.info) { - result.info.Scheme = JSON.parse(result.info.Scheme) - } else if (result.F_Content) { - result.F_Content = JSON.parse(result.F_Content) - } - - return result - }, - - /** - * 从 processInfo 流程信息中,提取出 currentNode - * 参数: processInfo - * - */ - getCurrentNode(processInfo) { - if (processInfo.info) { - return processInfo.info.Scheme.nodes.find(t => t.id === processInfo.info.CurrentNodeId) - } else if (processInfo.F_Content) { - return processInfo.F_Content.nodes.find(t => t.type === 'startround') - } - - return {} - }, - - /** - * 拉取表单的 schemeData - * 参数: currentNode - * - * 从当前节点 currentNode 中提取出表单 id,然后自 API 地址 /form/scheme 中拉取表单数据并返回 - */ - async fetchSchemeData(currentNode, currentTask, type) { - const { wfForms } = currentNode - - const data = wfForms.filter(t => t.formId).map(t => ({ id: t.formId, ver: '' })) - const schemeData = await this.HTTP_GET('learun/adms/form/scheme', data) - - return schemeData || {} - }, - - /** - * 拉取表单的 formData - * 参数: currentNode, keyValue - * - * 提取当前节点信息、表单主键信息,从 API 地址 /form/data 中拉取表单数据 - */ - async fetchFormData({ wfForms }, keyValue) { - const reqData = wfForms - .filter(t => t.formId) - .map(t => ({ - schemeInfoId: t.formId, - processIdName: t.field, - keyValue - })) - - const formData = await this.HTTP_GET('learun/adms/form/data', reqData) - - return formData || {} - } - } + mixins: [customForm], + + methods: { + /** + * 从流程信息中生成 scheme、formValue + * 参数: { schemeData (必填), processId, currentNode, formData (新建时为 null), code, useDefault } + * 返回: { scheme, formValue, rel } + * + * 参数: + * schemeData: 使用 fetchSchemeData 方法拉取到的原始 scheme 数据,未经过格式化处理 + * processId: 表单 GUID;如果是新建表单,可以用 this.GUID('-') 生成一个 + * currentNode: 使用 getCurrentNode 方法拉取到的当前节点信息,用于权限控制 + * formData: 填入表单的表单值,新建表单时此项为 null 即可 + * code: 表单编号 code,会被赋值到返回的 formValue.code;重新发起流程的场合赋 null + * useDefault: 如果 formData 中某一项为空,是否对这一项填入默认值;通常在编辑草稿时启用 + * + * 该方法返回的 scheme 项可能带有以下属性: + * __valuePath__: 表单值在 formValue 中的路径,使用 lodash 的 get、set 方法即可读写 + * __sourceData__: 表单值的选单数据 + * __defaultItem__: 类型为 girdtable 的表单项带有此属性,表示添加一行表格时候表格项的默认值 + * __schemeIndex__: (暂时用不到)表单项位于 schemeData 根级内的第几个子项中 + * __dataIndex__: (暂时用不到)表单项位于 F_Scheme.data 中的第几个子项中 + */ + async getCustomForm(prop) { + const { + schemeData, + formData, + currentNode, + code, + processId, + useDefault + } = prop + // 处理字段之间的级联、绑定关系 + // 需要绑定 change 事件的: + // datetime: 修改后重新计算 datetimerange + // organize: 修改后重设级联到该组件的其他组件的值,user 一级无需处理 + // 需要绑定某值的: + // organize: 级联到某个组件,company 一级无需处理 + const schemeRef = {} + const refList = [] + + // 最终返回值:scheme、rel、formValue + const scheme = [] + const rel = {} + const formValue = { + processId, + formreq: [] + } + if (code) { + formValue.code = code + } + + // 遍历 schemeData 中所有的 scheme + const schemeList = Array.isArray(schemeData) ? schemeData : Object.values(schemeData) + for (let schemeIndex = 0; schemeIndex < schemeList.length; ++schemeIndex) { + + const schemeItem = schemeList[schemeIndex] + schemeItem.F_Scheme = JSON.parse(schemeItem.F_Scheme) + // 已有表单值的时候,舍弃掉不存在表单值中的 scheme + if (formData && !formData[schemeItem.F_SchemeInfoId]) { + continue + } + + // 设置 formreq 的内容,非新建模式下需要设置 keyValue + const { + formId, + field + } = get(currentNode, `wfForms.${schemeIndex}`, {}) + const formreqObj = { + schemeInfoId: formId, + processIdName: field, + formData: {} + } + if (formData) { + if (Object.values(get(formData, `${schemeItem.F_SchemeInfoId}`, {})).some(t => t && t.length > + 0)) { + formreqObj.keyValue = processId + } + } + formValue.formreq[schemeIndex] = formreqObj + + for (let dataIndex = 0; dataIndex < schemeItem.F_Scheme.data.length; ++dataIndex) { + const { + componts + } = schemeItem.F_Scheme.data[dataIndex] + for (const t of componts) { + // 之后的 t 即表示每个 scheme 项 + t.__valuePath__ = `formreq.${schemeIndex}.formData.${t.id}` + // 以下两个属性暂时用不到 + t.__schemeIndex__ = schemeIndex + t.__dataIndex__ = dataIndex + + if (t.type === 'girdtable' && t.table) { + // 数据项是表格的情况 + // 先设置源数据,不然无法获取默认值 + for (const fieldItem of t.fieldsData) { + fieldItem.__sourceData__ = await this.getSourceData(fieldItem) + } + t.__defaultItem__ = await this.getDefaultData(t, prop) + if (formData) { + // 有表单值的情况,从表单值中获取数据 + const val = [] + for (const valueItem of get(formData, `${schemeItem.F_SchemeInfoId}.${t.table}`, + [])) { + const tableItemValue = {} + for (const fieldItem of t.fieldsData.filter(t => t.field)) { + const formDataValue = get(valueItem, fieldItem.field.toLowerCase()) + tableItemValue[fieldItem.field] = await this.convertToFormValue(fieldItem, + formDataValue) + } + + val.push(tableItemValue) + } + + // useDefault 表示在从 formData 取不到值的时候使用默认值 + if ((!val || val.length <= 0) && useDefault) { + set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)]) + } else { + set(formValue, t.__valuePath__, val) + } + + } else { + // 无表单值的情况,默认值 + set(formValue, t.__valuePath__, [this.COPY(t.__defaultItem__)]) + } + + } else if (t.field) { + // 数据项不是表格的情况 + // 先设置源数据,不然无法获取默认值 + t.__sourceData__ = await this.getSourceData(t) + if (formData) { + // 有表单值的情况,从表单值中获取数据 + const path = + `${schemeItem.F_SchemeInfoId}.${t.table}.${dataIndex}.${t.field.toLowerCase()}` + const formDataValue = get(formData, path) + + // useDefault 表示在从 formData 取不到值的时候使用默认值 + if (!formDataValue && useDefault) { + set(formValue, t.__valuePath__, await this.getDefaultData(t, prop)) + } else { + set(formValue, t.__valuePath__, await this.convertToFormValue(t, formDataValue)) + } + + } else { + // 无表单值的情况,默认值 + set(formValue, t.__valuePath__, await this.getDefaultData(t, prop)) + } + } + + // 权限控制 + const authObj = get(currentNode, `wfForms.${schemeIndex}.authorize.${t.id}`, {}) + t.edit = authObj.isEdit + if (Number(t.isHide) !== 1 && authObj.isLook !== 0) { + // 加入 scheme + scheme.push(t) + + // organize、datetime 可能作为其他 organize 或 datetimerange 的依赖项,引用它们 + if (['organize', 'datetime'].includes(t.type)) { + schemeRef[t.id] = t + } + + // datetimerange、带有 relation 级联字段的 organize,依赖其他项 + if ((t.type === 'datetimerange' && t.startTime && t.endTime) || (t.type === + 'organize' && t.relation)) { + refList.push(t) + } + } + } + } + } + + // 依次处理表单关联 + refList.forEach(t => { + if (t.type === 'organize') { + // 处理组件结构级联 + // 给当前组件赋上级级联的值路径 __relationPath__ + const parent = schemeRef[t.relation] + t.__relationPath__ = parent.__valuePath__ + // 给上级级联的组件注册自动重置当前组件的 change 事件 + const relItem = { + type: 'organize', + id: t.id, + path: t.__valuePath__ + } + rel[parent.id] = rel[parent.id] ? rel[parent.id].concat(relItem) : [relItem] + + } else if (t.type === 'datetimerange') { + // 处理日期区间 + const start = schemeRef[t.startTime] + const end = schemeRef[t.endTime] + + const relItem = { + type: 'datetimerange', + path: t.__valuePath__, + id: t.id, + startPath: start.__valuePath__, + endPath: end.__valuePath__, + } + + rel[start.id] = rel[start.id] ? rel[start.id].concat(relItem) : [relItem] + rel[end.id] = rel[end.id] ? rel[end.id].concat(relItem) : [relItem] + + } + }) + + return { + scheme, + formValue, + rel + } + }, + newguid() { + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, + v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }, + /** + * 获取最终需要 POST 的数据 + * 参数:formValue, scheme + * 返回:用于提交的数据 + * + * 遍历 formValue,将其中的表单值依次使用 convertToPostData 这个方法转化为提交值 + */ + async getPostData(originFormValue, scheme) { + const formValue = this.COPY(originFormValue) + // 依次按照 scheme 项目遍历 + for (const item of scheme) { + if (item.field) { + // 不是表格的情况 + const path = item.__valuePath__ + const val = get(formValue, path) + + if (item.type == 'upload') { + // 先生成一个guid + var guid = this.newguid(); + // 取出当前列对应的labelId + var labeId = item.id + // 从缓存取出当前审批流程所有的guid + var guids = JSON.parse(uni.getStorageSync('guids')) + if (guids&&JSON.stringify(guids)!=='{}') { + guid = guids[labeId] + } + } + const result = await this.convertToPostData(item, val, originFormValue, scheme, guid) + set(formValue, path, result) + + } else if (item.table && item.fieldsData) { + // 是表格的情况 + const tableValue = get(formValue, item.__valuePath__, []) + for (let valueIndex = 0; valueIndex < tableValue.length; ++valueIndex) { + for (const schemeItem of item.fieldsData) { + const path = `${item.__valuePath__}.${valueIndex}.${schemeItem.field}` + const val = get(formValue, path) + + const result = await this.convertToPostData(schemeItem, val, originFormValue, scheme, + guid) + set(formValue, path, result) + } + } + } + } + + formValue.formreq.forEach(t => { + t.formData = JSON.stringify(t.formData) + }) + formValue.formreq = JSON.stringify(formValue.formreq) + + return formValue + }, + + /** + * 获取流程信息 + * 参数: { code, processId, taskId } + * + */ + async fetchProcessInfo({ + code, + processId, + taskId + }) { + const url = processId ? 'learun/adms/newwf/processinfo' : 'learun/adms/newwf/scheme' + const reqObj = { + processId + } + if (taskId) { + reqObj.taskId = taskId + } + const data = processId ? reqObj : code + const result = await this.HTTP_GET(url, data) + + if (!result) { + return {} + } + + if (result.info) { + result.info.Scheme = JSON.parse(result.info.Scheme) + } else if (result.F_Content) { + result.F_Content = JSON.parse(result.F_Content) + } + + return result + }, + + /** + * 从 processInfo 流程信息中,提取出 currentNode + * 参数: processInfo + * + */ + getCurrentNode(processInfo) { + if (processInfo.info) { + return processInfo.info.Scheme.nodes.find(t => t.id === processInfo.info.CurrentNodeId) + } else if (processInfo.F_Content) { + return processInfo.F_Content.nodes.find(t => t.type === 'startround') + } + + return {} + }, + + /** + * 拉取表单的 schemeData + * 参数: currentNode + * + * 从当前节点 currentNode 中提取出表单 id,然后自 API 地址 /form/scheme 中拉取表单数据并返回 + */ + async fetchSchemeData(currentNode, currentTask, type) { + const { + wfForms + } = currentNode + + const data = wfForms.filter(t => t.formId).map(t => ({ + id: t.formId, + ver: '' + })) + const schemeData = await this.HTTP_GET('learun/adms/form/scheme', data) + + return schemeData || {} + }, + + /** + * 拉取表单的 formData + * 参数: currentNode, keyValue + * + * 提取当前节点信息、表单主键信息,从 API 地址 /form/data 中拉取表单数据 + */ + async fetchFormData({ + wfForms + }, keyValue) { + const reqData = wfForms + .filter(t => t.formId) + .map(t => ({ + schemeInfoId: t.formId, + processIdName: t.field, + keyValue + })) + + const formData = await this.HTTP_GET('learun/adms/form/data', reqData) + + return formData || {} + }, + async fetchFolderkeyData(currentNode, keyValue) { + const { + wfForms + } = currentNode + + const reqData = wfForms + .filter(t => t.formId) + .map(t => ({ + id: t.formId, + ver: '', + schemeInfoId: t.formId, + processIdName: t.field, + keyValue + })) + const folderkeyData = await this.HTTP_GET('learun/adms/form/folderkey', reqData) + return folderkeyData || {} + }, + } } diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/list.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/list.vue index 12e6bc94c..6d4a550f6 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/list.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/list.vue @@ -14,6 +14,7 @@ 支 付 + 查看发票 @@ -44,6 +45,9 @@ export default { this.TOAST('缴费成功'); } }); + }, + lookInvoice(){ + this.NAV_TO("./payInvioce") } }, created() { diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payInvioce.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payInvioce.vue new file mode 100644 index 000000000..48f5000dd --- /dev/null +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payInvioce.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payqrcode.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payqrcode.vue new file mode 100644 index 000000000..b9a1b61c0 --- /dev/null +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/onlienpay/payqrcode.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentAttendance/single.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentAttendance/single.vue index a0a2db9b2..e16bb6b93 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentAttendance/single.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentAttendance/single.vue @@ -36,7 +36,7 @@ 暂时没有信息 - + {{ weekData.rows[ind].StuName }} 学号: {{ weekData.rows[ind].StuNo }} @@ -55,7 +55,7 @@ {{ n.txt }} @@ -491,6 +491,7 @@ export default{ text-align: center; font-size: 14px; color: #1a1a1a; + background-color: #ffffff; } .timeTableAlertLi.active { @@ -500,8 +501,4 @@ export default{ .timeTableAlertLi:nth-child(2n) { background-color: #fbfdff; } - -.timeTableAlertLi:nth-child(2n - 1) { - background-color: #ffffff; -} diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentSee/list.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentSee/list.vue index f798c045f..7a944a59d 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentSee/list.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/studentSee/list.vue @@ -72,7 +72,6 @@ export default { '加载数据时出错' ).then( res => { this.HIDE_LOADING() - // console.log(res) if (res == null || JSON.stringify(res) == '{}') { _this.flag = false; return; diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/timeTable/list.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/timeTable/list.vue index 9d5960cd4..1bc43b77d 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/timeTable/list.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/timeTable/list.vue @@ -28,10 +28,10 @@ - + 该时间段没有课表 - + 第 {{ k.jc }} 节 diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/weixinLogin.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/weixinLogin.vue index 4a7041cc3..3e53e5411 100644 --- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/weixinLogin.vue +++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/weixinLogin.vue @@ -25,13 +25,13 @@ - + - 确 认 + 确 认 常规登陆 @@ -68,11 +68,14 @@