# YoursLC有源低代码 **Repository Path**: adaiauto/your-lc-active-low-code ## Basic Information - **Project Name**: YoursLC有源低代码 - **Description**: 让简单的事情保持简单,让复杂的事情成为可能。 既是零代码也是低代码还是全代码,十倍以上提高开发效率并且可以任意扩展 讨论交流QQ群(937494747) - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 147 - **Created**: 2023-11-25 - **Last Updated**: 2023-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # YoursLC有源低代码 #### V1.10更新 20231014 - 移动端增强功能,自动生成适配移动端的H5页面 - 代码模板功能,解决重新生成时代码覆盖的问题 - ...... - 修复了已知bug,部分功能做了优化 **备注:本次发布,只支持mysql数据库,sqlserver数据库还未做适配** #### 在线体验 http://203.189.7.11:9009 admin 123456 #### 软件架构 基于net6 MVC + Dapper + LayUI + jquery,支持mysql、sqlserver数据库 #### 帮助 - 帮助文档 https://gitee.com/think9/your-lc-active-low-code/wikis/pages - YoursLc有源低代码搭建进销存(一)-哔哩哔哩 https://www.bilibili.com/video/BV16k4y1p7Do/ - YoursLc有源低代码搭建进销存(二)-哔哩哔哩 https://www.bilibili.com/video/BV1aV4y127sN/ - YoursLC快速搭建统计报表 https://www.bilibili.com/video/BV12v4y1X7Xq/ - YoursLC简介 https://www.bilibili.com/video/BV18N4y177xx/ - YoursLC快速搭建web应用 https://www.bilibili.com/video/BV1bW4y127os/ #### 介绍 yours你们的、LC是低代码low-code的缩写,中文名称:有源低代码。满足用户高效率、低成本和个性化的需求。YoursLC既是零代码也是低代码还是全代码,几十倍提高效率可以任意扩展,产品无代码搭建了进销存Demo,包括数据规范、数据回写、数据读取等,都是无代码实现,一键可生成全代码。 YoursLC有源低代码有如下特点: - 共同协作:业务人员当零代码用开发人员做全代码开发,减少沟通成本提高协作效率 - 提升效率:可提高十倍以上开发效率 - 任意扩展:不同于多数低代码工具,我们产品可以任意修改任意扩展 - 用户可控:涉及自定义功能模块运行的代码100%开源 - 简单灵活:操作简单,生成的代码易懂易修改 产品分为两个版本,开发版及发布版 - **发布版可在windows系统直接运行,使用发布版可搭建web应用(即零代码实现)** ,发布版不能修改源代码及调试代码。文件夹“YoursLC发布版-可独立运行”即是发布版; - 开发版需使用vs2019及以上版本打开,可以搭建web应用、修改源码和调试代码; - **开发版使用发布模式无需替换代码也能按照最新设置运行程序,可查看运行效果,最后一键生成源码,然后再启用调式模式进行代码调试和修改** ,如此可大大提高开发效率 #### 功能截图 移动端增强功能,自动生成适配移动端的页面 ![输入图片说明](%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20231014104344.jpg)![输入图片说明](%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20231014104528.jpg)![输入图片说明](%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20231014104611.jpg) 【数据规范】为录入表指标指定数据规范,可实现自动填写(为文本框赋值)、选择输入(为下拉框、弹出选择设置数据源),包括自动编号、单列选择、多列选择、树形选择 ![输入图片说明](image001.png) 【录入指标】录入表的录入项,对应数据表的字段和实体类属性。定义录入表(主表)需首先定义录入指标 ![输入图片说明](image002.png) 【自定义录入表步骤】 1:新建主表;2:为主表添加指标并设置指标属性及数据规范;3:为主表添加子表(可选);4:创建数据表;5:设置自定义事件、数据读取、页面按钮等...;6:表单设计;7:为录入表添加菜单;8:重新生成查看运行效果;9:代码生成并调试测试(需启动调试模式);10:修改、测试并发布 ![输入图片说明](image003.png) 【自定义事件】可对主表的AfterAdd、AfterEdit、AfterFinish、AfterDelete,子表的AfterGridAdd、AfterGridEdit、AfterGridDel事件进行自定义,以上事件分别在添加完成、编辑完成、删除完成后被调用;通过自定义包含参数的sql语句或调用已定义的存储过程,对数据表进行新增、编辑、删除操作,实现数据同步等目的 ![输入图片说明](image004.png) 【数据读取】数据读取包括三类:1:读取单值,如选择产品后为产品名称、计量单位等控件赋值;2:读取列表值,为下拉选择赋值,如实现数据联动; 3:自动读取其他录入表数据为子表赋值(更新子表数据) ![输入图片说明](image005.png) 【表单设计】 ![输入图片说明](image006.png) 【数据回写】在指定的条件下(适用范围)按照设定的规则对满足条件的录入表数据进行修改 ![输入图片说明](image007.png) 【自定义统计报表】可通过两种方式创建统计表:1.基于录入表(视图)创建,统计表的列来源于录入表(视图)或自定义的统计指标;2.一般方式创建,可以自由设置统计表的单元格,单元格可以为自定义的统计指标(参数)或字符 基于录入表(视图)创建,需为统计表指定显示列、查询字段和排序字段等;一般方式创建统计表步骤: 1.新建统计表; 2.编辑行列--将单元格设置为自定义的统计指标或字符(如果统计指标包含条件参数需为条件参数赋值); 3.定义动态行,实现行统计表行的自增长; 4.定义查询参数(非必须); 5:为统计表添加菜单;6:【启动发布模式】查看效果;7:代码生成并调试测试(需【启动调试模式】) 统计表基于rdlc报表创建,可使用rdlc报表编辑器在数据列表上添加各类图表 ![输入图片说明](image008.png) 【重新生成】重新生成后,将自动【启动发布模式】,【启动发布模式】无需替换代码也能按照最新设置运行程序 ![输入图片说明](image009.png) 【生成代码并下载】下载后,参看说明将文件按要求放置,并启动调试模式,【启动调试模式】可使用代码调式功能 ![输入图片说明](image010.png) #### 生成的代码(无手写) 以下代码全部自动生成,无一行手写 ``` /******************************************************************************* * Creator:admin 2023-08-01 11:22:45 * Description: YoursLC有源低代码 *********************************************************************************/ using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Think9.Controllers.Basic; using Think9.Models; using Think9.Services.Base; using Think9.Services.Basic; using Think9.Services.Com; using Think9.Services.CodeBuild; namespace Think9.Controllers.CodeBuild { public class WarehousingOfGoodsController : BaseController { private WarehousingOfGoodsService tbWarehousingOfGoods = new WarehousingOfGoodsService(); private WarehousingDetailsService gridWarehousingDetails = new WarehousingDetailsService();//子表 private ComService comService = new ComService(); private readonly string _maintbid = "tb_WarehousingOfGoods";//主表编码 private readonly string _flowid = "bi_WarehousingOfGoods";//流程编码 bi_基础信息 fw_一般录入表 private readonly string _tbname = "货品入库";//录入表名称 private readonly string _split = Think9.Services.Base.BaseConfig.ComSplit;//多选项的字符分割 private string str; #region list列表页面 /// /// 调试模式下点击左侧菜单触发,菜单路径为主表编码去除tb_前缀 /// /// /// public override ActionResult Index(int? id) { string err = CheckCom.CheckedBeforeBegin(_flowid);//检查数据库是否建表等 if (string.IsNullOrEmpty(err)) { object param = BasicHelp.GetParamObject(CurrentUser);//系统参数可作为数据规范的条件参数 ViewBag.SelectList = tbWarehousingOfGoods.GetSelectList("list", param);//为查询条件(下拉选择)准备动态数据 ViewBag.SearchMode = BasicHelp.GetSearchMode(_flowid);//查看编辑模式-录入表管理/权限设置可设置 //禁用按钮字符,格式[butid1][butid2],用于按钮权限控制,录入表管理/页面按钮可设置 ViewBag.DisableBut = tbWarehousingOfGoods.GetDisableButStr("list", CurrentUser); return base.Index(id); } else { return Json(err); } } /// /// 添加前判断及处理,列表页面点击新增数据按钮触发 /// /// 类型add /// 基础信息表自增长,一般录入表对应flowrunlist中的listid /// [HttpPost] public ActionResult BeforeAdd(string type, string listid) { string err = ""; long newid = 0;//自动编号及子表数据初始化等情况需插入空数据并返回自增长id try { CurrentPrcsEntity mPrcs = FlowCom.GetFistStept(_flowid);//得到步骤第一步,基本信息表返回空 err = mPrcs == null ? "" : mPrcs.ERR; if (string.IsNullOrEmpty(err)) { err = CheckCom.CheckedBeforeAdd(_flowid, mPrcs, CurrentUser);//添加前检测 if (string.IsNullOrEmpty(err)) { newid = tbWarehousingOfGoods.BeforeAdd(ref err, mPrcs, CurrentUser);//添加前处理 } } if (string.IsNullOrEmpty(err)) { string pid = mPrcs == null ? "-1" : mPrcs.PrcsId;//当前流程步骤id return Json(SuccessTip("", newid.ToString(), pid));//将当前listid及当前流程步骤id返回 } else { return Json(ErrorTip(err)); } } catch (Exception ex) { Record.AddErr(newid.ToString(), _flowid, "WarehousingOfGoodsController:BeforeAdd", ex); return Json(ErrorTip(ex.Message)); } } /// /// 编辑前判断及处理,列表页面点击编辑按钮触发 /// /// 类型edit /// 基础信息表自增长,一般录入表对应flowrunlist中的listid /// [HttpPost] public ActionResult BeforeEdit(string type, string listid) { string err = ""; CurrentPrcsEntity mPrcs = FlowCom.GetCurrentStept(_flowid, listid); //当前流程步骤,基本信息表返回空 err = mPrcs == null ? "" : mPrcs.ERR; if (string.IsNullOrEmpty(err)) { err = CheckCom.CheckedBeforeEdit(_flowid, listid, mPrcs, CurrentUser);//编辑前检测 if (string.IsNullOrEmpty(err)) { err = tbWarehousingOfGoods.BeforeEdit(listid, mPrcs, CurrentUser);//编辑前数据处理 } } if (string.IsNullOrEmpty(err)) { string pid = mPrcs == null ? "-1" : mPrcs.PrcsId;//当前流程步骤id return Json(SuccessTip("", listid, pid)); } else { return Json(ErrorTip(err)); } } /// /// 数据查看,列表页面点击详细按钮触发 /// /// 基础信息表自增长,一般录入表对应flowrunlist中的listid /// [HttpGet] public ActionResult Detail(string listid) { TbBasicEntity model = PageCom.GetDetailButon(listid, _flowid);//按钮设置,可在录入表管理/页面按钮中设置 ViewBag.ListId = listid; ViewBag.ButPdf = model.ButPDFDetails;//Pdf是否显示 1显示 ViewBag.ButDoc = model.ButDOCDetails;//DOC是否显示 1显示 ViewBag.ButExcel = model.ButExcelDetails;//Excel是否显示 1显示 ViewBag.ButAtt = model.ButAtt;//附件按钮是否显示 1显示 ViewBag.ButAttTxt = model.ButAttTxt;//附件按钮标题 ViewBag.UserId = CurrentUser == null ? "!undefined" : CurrentUser.Account; return View(); } /// /// 导出EXCEL,点击导出按钮触发 /// /// [HttpPost] public ActionResult ExportData(string json) { string err = ""; string newFileName = System.Guid.NewGuid().ToString("N") + ".xlsx"; string sourcePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\TempFile\\" + newFileName); WarehousingOfGoodsModel model = tbWarehousingOfGoods.ToModel(json); DataTable gridDt = tbWarehousingOfGoods.GetListForExport(model, CurrentUser); RdlcDeviceEntity device = WarehousingOfGoodsService.GetRdlcDevice(gridDt); byte[] _byte = RDLCReport.ExportExcelList(ref err, device); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } Think9.Util.Helper.FileHelper.CreateFile(sourcePath, _byte); string url = "

点击下载
"; return Json(SuccessTip("", url)); } /// /// 批量导出pdf,列表页面点击批量导出按钮触发 /// /// listid逗号间隔 /// public JsonResult MergeExport(string idsStr) { string err = ""; string directory = Directory.GetCurrentDirectory(); string sourcePath = Path.Combine(directory, "wwwroot\\TempFile\\" + System.Guid.NewGuid().ToString("N") + "\\"); Think9.Util.Helper.FileHelper.CreateSuffic(sourcePath); string pdfFileName = System.Guid.NewGuid().ToString("N") + ".pdf"; string[] arr = BaseUtil.GetStrArray(idsStr, ","); for (int i = 0; i < arr.GetLength(0); i++) { if (arr[i] != null) { string listid = arr[i].ToString().Trim(); RdlcDeviceEntity device = WarehousingOfGoodsService.GetRdlcDevice(listid); byte[] _byte = RDLCReport.ExportPdf(ref err, device); Think9.Util.Helper.FileHelper.CreateFile(sourcePath + "\\" + listid + ".pdf", _byte); } } PdfService.MergePDF(sourcePath, Path.Combine(directory, "wwwroot\\TempFile\\"), pdfFileName); string url = "

点击下载
"; return Json(SuccessTip("", url)); } /// /// 查看详细,列表页面点击详细按钮触发,将rdlc模板填充数据后转化为pdf等 /// /// 类别pdf、doc、excel /// 基础信息表自增长,一般录入表对应flowrunlist中的listid /// [HttpGet] public ActionResult GetDetail(string type, string listid) { string err = ""; listid = ListIdService.GetOriginalListId(listid).ToString(); FileContentResult file = null; RdlcDeviceEntity device = WarehousingOfGoodsService.GetRdlcDevice(listid); if (!string.IsNullOrEmpty(device.Err)) { return Json(ErrorTip(device.Err)); } if (type == "html" || type == "_html") { byte[] _byte = RDLCReport.ExportHtml(ref err, device); file = File(_byte, "text/html"); } if (type == "pdf") { //device.width默认22cm,device.heigh默认29.7cm,可传入其他值,以适应不同文档和打印尺寸 byte[] _byte = RDLCReport.ExportPdf(ref err, device); file = File(_byte, "application/pdf"); } if (type == "doc") { byte[] _byte = RDLCReport.ExportDocx(ref err, device); file = File(_byte, "application/msword", _tbname + DateTime.Today.ToShortDateString() + ".docx"); } if (type == "excel") { byte[] _byte = RDLCReport.ExportXlsx(ref err, device); file = File(_byte, "application/msexcel", _tbname + DateTime.Today.ToShortDateString() + ".xlsx"); } if (string.IsNullOrEmpty(err)) { return file; } else { return Json(ErrorTip(err)); } } /// /// 数据删除(可处理软删除),列表页面点击删除按钮触发 /// /// 基础信息表自增长,一般录入表对应flowrunlist的listid /// [HttpGet] public JsonResult Delete(string listid) { CurrentPrcsEntity mPrcs = FlowCom.GetCurrentStept(_flowid, listid);//当前流程步骤 string err = mPrcs == null ? "" : mPrcs.ERR; if (string.IsNullOrEmpty(err)) { err = CheckCom.CheckedBeforeDel(_flowid, listid, mPrcs, CurrentUser);//校验 包括权限、锁定等 } try { if (string.IsNullOrEmpty(err)) { err = tbWarehousingOfGoods.DelByListId(listid, CurrentUser); } if (string.IsNullOrEmpty(err)) { Record.Add(CurrentUser == null ? "!undefined" : CurrentUser.Account, listid, _flowid, "#删除数据#"); return Json(SuccessTip("删除成功")); } else { return Json(ErrorTip(err)); } } catch (Exception ex) { Record.AddErr(listid, _flowid, "WarehousingOfGoodsController:Delete", ex); return Json(ErrorTip(ex.Message)); } } /// /// 批量删除,列表页面点击批量删除按钮触发 /// /// listid逗号间隔 /// [HttpPost] public JsonResult BatchDel(string idsStr) { string err = ""; string showErr = ""; int numSuccess = 0; int numFail = 0; string listid = ""; string[] arr = BaseUtil.GetStrArray(idsStr, ","); try { for (int i = 0; i < arr.GetLength(0); i++) { if (arr[i] != null) { listid = arr[i].ToString().Trim(); CurrentPrcsEntity mPrcs = FlowCom.GetCurrentStept(_flowid, listid);//当前流程步骤 err = mPrcs == null ? "" : mPrcs.ERR; if (string.IsNullOrEmpty(err)) { err = CheckCom.CheckedBeforeDel(_flowid, listid, mPrcs, CurrentUser);//检测 if (string.IsNullOrEmpty(err)) { err = tbWarehousingOfGoods.DelByListId(listid, CurrentUser); if (string.IsNullOrEmpty(err)) { numSuccess++; } else { showErr += err; numFail++; } } else { numFail++; } } else { numFail++; } } } if (string.IsNullOrEmpty(showErr)) { str = numFail == 0 ? "删除成功" + numSuccess.ToString() + "数据" : "删除成功" + numSuccess + "数据;" + "因数据无效、锁定、权限校验等原因,删除失败" + numFail.ToString() + "数据;"; return Json(SuccessTip(str)); } else { return Json(ErrorTip(showErr)); } } catch (Exception ex) { Record.AddErr(listid, _flowid, "WarehousingOfGoodsController:BatchDel", ex); return Json(ErrorTip(ex.Message)); } } /// /// 数据查询,列表页面点击查询按钮触发 /// /// 封装查询条件 /// 页面信息,包括行数、排序等 /// 为all显示所有 /// [HttpPost] public JsonResult GetPageList(WarehousingOfGoodsModel model, PageInfoEntity pageInfo, string isAll) { if (CurrentUser == null) { return Json(new { msg = "超时 请重新登录", count = -1 }); } pageInfo.field = "listid";//添加次序倒序 pageInfo.order = "desc"; long total = 0; try { List list = tbWarehousingOfGoods.GetListForPage(ref total, model, pageInfo, CurrentUser, isAll); if (list == null) { return Json(new { msg = "参数错误", count = -1 }); } else { var result = new { code = 0, msg = "", count = total, data = list }; return Json(result); } } catch (Exception ex) { Record.AddErr("", _flowid, "WarehousingOfGoodsController:GetPageList", ex); return Json(new { msg = ex.Message, count = -1 }); } } /// /// 数据导入,点击数据导入按钮触发 /// /// /// 文件名 /// 源字段与目标字段的对应列表 /// [HttpPost] public ActionResult ImportData(string fwid, string filename, List list) { string err = ""; string listidsStr = ""; string msg = ""; string timeBegin = DateTime.Now.ToString(); if (CurrentUser == null) { return Json(ErrorTip("当前用户对象为空")); } try { ExcelData excelData = new ExcelData(); err = excelData.ImportDataFromExcel(ref listidsStr, ref msg, fwid, filename, list, CurrentUser); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } else { var resultList = tbWarehousingOfGoods.BatchAfterAdd(ref err, listidsStr, CurrentUser);//添加后数据处理 if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } msg = timeBegin + " - " + DateTime.Now.ToString() + " " + msg; return Json(SuccessTip(msg)); } } catch (Exception ex) { Record.AddErr("", _flowid, "WarehousingOfGoodsController:ImportData", ex); return Json(ErrorTip(ex.Message)); } } #endregion list列表页面 #region Form编辑页面 /// /// 录入页面显示 /// /// 从哪里跳转来的(默认list):list页面或其他页面跳转,前端依据该值可区别处理 /// add或edit /// 基础信息表自增长,一般录入表与flowrunlist中的listid对应关联 /// 当前流程步骤id /// [HttpGet] public ActionResult Form(string frm, string type, string listid, string pid) { long newid = 0; object param = BasicHelp.GetParamObject(CurrentUser);//数据规范中的筛选条件可使用系统参数 ViewBag.SelectList = tbWarehousingOfGoods.GetSelectList(type, param);//为下拉选择、多选组件选项赋值 ViewBag.UserId = CurrentUser == null ? "!undefined" : CurrentUser.Account;//当前用户id ViewBag.Split = _split;//字符分割,checkbox多选时使用 ViewBag.FId = _flowid;//流程编码 //禁用按钮字符,格式[butid1][butid2],用于按钮权限控制,录入表管理/页面按钮可设置 ViewBag.DisableBut = tbWarehousingOfGoods.GetDisableButStr("form", CurrentUser); ViewBag.Frm = string.IsNullOrEmpty(frm) ? "list" : frm;//list页面和其他页面跳转,前端可区分处理 if (ViewBag.Frm == "list") { newid = listid == null ? 0 : long.Parse(listid); ViewBag.PrcId = pid;//流程步骤id ViewBag.PrcNo = FlowCom.GetFlowNoByID(_flowid, pid);//流程步骤编码 ViewBag.Type = type;//add或edit ViewBag.ListId = newid; } else { CurrentPrcsEntity mPrcs = FlowCom.GetFistStept(_flowid);//得到步骤第一步 string err = mPrcs == null ? "" : mPrcs.ERR; if(!string.IsNullOrEmpty(err)) { return Json(err); } err = CheckCom.CheckedBeforeAdd(_flowid, mPrcs, CurrentUser);//添加前检测 if (!string.IsNullOrEmpty(err)) { return Json(err); } //添加前处理,如自动编号及子表数据初始化等--主表需插入一条空数据 newid = tbWarehousingOfGoods.BeforeAdd(ref err, mPrcs, CurrentUser); if (!string.IsNullOrEmpty(err)) { return Json(err); } ViewBag.PrcId = mPrcs == null ? "-1" : mPrcs.PrcsId;//当前流程步骤id ViewBag.PrcNo = FlowCom.GetFlowNoByID(_flowid, ViewBag.PrcId);//流程步骤编码 ViewBag.Type = "add"; ViewBag.ListId = newid; } //包括为录入指标赋初始值--系统指标或默认值 WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModel(type, newid, CurrentUser); if (model != null) { return View(model); } else { return Json("数据不存在"); } } /// /// 数据保存,Form页面点击保存按钮触发 /// /// 主表数据 /// 子表数据 /// listid=0表示增加 /// 流程步骤编码 /// add或edit /// 附件id /// [HttpPost] public ActionResult SaveData(WarehousingOfGoodsModel model, IEnumerable gridlist, long listid, string prcno, string type, string att) { string err = ""; try { if (listid != 0)//编辑 { err = this.Edit(model, gridlist, listid, prcno);//编辑主子表数据,调用子表的AfterGridEdit事件 } else { listid = this.Add(ref err, prcno, model);//添加主表数据 } if (string.IsNullOrEmpty(err) && type == "add") { AttachmentService.UpdateAttachmentId(listid, _flowid, att);//处理listid=0时添加了附件 } if (string.IsNullOrEmpty(err)) { List resultList = type == "add" ? tbWarehousingOfGoods.AfterAdd(ref err, listid.ToString(), CurrentUser, model) : tbWarehousingOfGoods.AfterEdit(ref err, listid.ToString(), prcno, CurrentUser, model);//自定义事件 string _type = type == "add" ? "自定义事件AfterAdd" : "自定义事件AfterEdit"; Record.AddResultList("system", listid.ToString(), _flowid, resultList, _type); if(!string.IsNullOrEmpty(err)) { return Json(ErrorTip("自定义事件出现错误:" + err)); } resultList = tbWarehousingOfGoods.WriteBackData(ref err, listid.ToString(), "edit", CurrentUser, model);//数据回写 Record.AddResultList("system", listid.ToString(), _flowid, resultList, "#数据回写#"); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip("数据回写出现错误:" + err)); } return Json(SuccessTip("操作成功")); } else { return Json(ErrorTip("操作失败!
" + err)); } } catch (Exception ex) { Record.AddErr(listid.ToString(), _flowid, "WarehousingOfGoodsController:SaveData", ex); return Json(ErrorTip(ex.Message)); } } /// /// 转交下一步--保存数据并流程转交,点击转交按钮触发 /// /// 主表数据model /// 子表数据列表 /// listid=0表示增加 /// 流程步骤编码 /// add或edit /// 附件id /// [HttpPost] public ActionResult NextStep(WarehousingOfGoodsModel model, IEnumerable gridlist, long listid, string prcno, string type, string att) { string err = ""; try { if (listid != 0)//编辑 { err = this.Edit(model, gridlist, listid, prcno);//编辑主子表数据,调用子表的AfterGridEdit事件 } else { listid = this.Add(ref err, prcno, model);//添加主表数据 } if (string.IsNullOrEmpty(err) && type == "add") { AttachmentService.UpdateAttachmentId(listid, _flowid, att);//处理listid=0时添加了附件 } if (string.IsNullOrEmpty(err)) { List resultList = type == "add" ? tbWarehousingOfGoods.AfterAdd(ref err, listid.ToString(), CurrentUser, model) : tbWarehousingOfGoods.AfterEdit(ref err, listid.ToString(), prcno, CurrentUser, model);//自定义事件 string _type = type == "add" ? "自定义事件AfterAdd" : "自定义事件AfterEdit"; Record.AddResultList("system", listid.ToString(), _flowid, resultList, _type); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip("自定义事件出现错误:" + err)); } resultList = tbWarehousingOfGoods.WriteBackData(ref err, listid.ToString(), "edit", CurrentUser, model);//数据回写 Record.AddResultList("system", listid.ToString(), _flowid, resultList, "#数据回写#"); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip("数据回写出现错误:" + err)); } if (_flowid.StartsWith("bi_")) { return Json(ErrorTip("数据保存成功,基础信息表不能被转交")); } else { return Json(SuccessTip("", listid.ToString())); } } else { return Json(ErrorTip("操作失败!
" + err)); } } catch (Exception ex) { Record.AddErr(listid.ToString(), _flowid, "WarehousingOfGoodsController:NextStep", ex); return Json(ErrorTip(ex.Message)); } } /// /// 结束--保存数据并结束流程,点击结束按钮触发 /// /// 主表数据model /// 子表数据 /// listid=0表示增加 /// 流程步骤编码 /// add或edit /// 附件id /// [HttpPost] public ActionResult Finish(WarehousingOfGoodsModel model, IEnumerable gridlist, long listid, string prcno, string type, string att) { if(type == "add") { return Json(ErrorTip("首次提交不能结束,请保存后再结束")); } string err = ""; try { if (listid != 0)//编辑 { err = this.Edit(model, gridlist, listid, prcno, "finish");//编辑主子表数据,调用子表的AfterGridFinish事件 } else { listid = this.Add(ref err, prcno, model);//添加主表数据 } if (string.IsNullOrEmpty(err) && type == "add") { AttachmentService.UpdateAttachmentId(listid, _flowid, att);//处理listid=0时添加了附件 } if (string.IsNullOrEmpty(err)) { List resultList = type == "add" ? tbWarehousingOfGoods.AfterAdd(ref err, listid.ToString(), CurrentUser, model) : tbWarehousingOfGoods.AfterFinish(ref err, listid.ToString(), prcno, CurrentUser, model);//自定义事件 完成后数据处理 string _type = type == "add" ? "自定义事件AfterAdd" : "自定义事件AfterFinish"; Record.AddResultList("system", listid.ToString(), _flowid, resultList, _type); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip("自定义事件出现错误:" + err)); } Record.Add("system", listid.ToString(), _flowid, "#流程结束##锁定数据#"); resultList = tbWarehousingOfGoods.WriteBackData(ref err, listid.ToString(), "finish", CurrentUser, model);//数据回写 Record.AddResultList("system", listid.ToString(), _flowid, resultList, "#数据回写#"); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip("数据回写出现错误:" + err)); } if (_flowid.StartsWith("bi_")) { return Json(SuccessTip("操作成功,数据已被锁定")); } else { return Json(SuccessTip("操作成功")); } } else { return Json(ErrorTip("操作失败!
" + err)); } } catch (Exception ex) { Record.AddErr(listid.ToString(), _flowid, "WarehousingOfGoodsController:Finish", ex); return Json(ErrorTip(ex.Message)); } } /// /// 点击打印按钮触发,将rdlc模板填充数据后转化pdf /// /// 类别 /// 数据id /// [HttpGet] public ActionResult Print(string type, string listid) { string err = ""; RdlcDeviceEntity device = WarehousingOfGoodsService.GetRdlcDevice(listid); if (string.IsNullOrEmpty(device.Err)) { //device.width默认22cm,device.heigh默认29.7cm,可传入其他值,以适应不同文档和打印尺寸 byte[] _byte = RDLCReport.ExportPdf(ref err, device); if (!string.IsNullOrEmpty(err)) { return Json(err); } FileContentResult file = File(_byte, "application/pdf"); return file; } else { return Json(device.Err); } } /// /// 下拉选择或者弹出选择后触发调用,完成数据读取功能 /// 数据读取在录入表管理/数据读取中自定义 /// /// 主表控件的list,包括id与value /// 子表数据列表 /// /// _main或子表编码 /// 下拉或者弹出选择(触发控件)对应的指标编码 /// 下拉或者弹出选择(触发控件)对应的控件Value /// 返回List前端再解析 [HttpPost] public ActionResult AfterControlSelect(IEnumerable controlslist, IEnumerable gridlist, string id, string tbid, string indexid, string value, string listid) { string grid = "";//子表id,子表写入数据时会修改该值,前端根据该值刷新子表数据 string newid = listid; try { List list = new List(); if (tbid == "_main") { list = tbWarehousingOfGoods.ReadValue(ref newid, ref grid, CurrentUser, controlslist, indexid, value); } if (tbid == "tb_WarehousingDetails") { list = gridWarehousingDetails.ReadValue(ref newid, ref grid, CurrentUser, controlslist, gridlist, indexid, value); } //返回的list交由前端myJS.setValueByList(lists)为控件赋值 return Json(SuccessTip("", list, newid, grid)); } catch (Exception ex) { Record.AddErr(listid, _flowid, "WarehousingOfGoodsController:AfterControlSelect", ex); return Json(ErrorTip(ex.Message)); } } /// /// 添加主表数据,listid=0时被调用 /// /// 错误信息 /// 当前流程步骤编码 /// 主表数据 /// private long Add(ref string err, string prcno, WarehousingOfGoodsModel model) { long listid = 0; DataTable dtMain = DataTableHelp.ModelToDataTable(model);//model转换DataTable //进行主键和唯一键检测,主键和唯一键可在录入表指标属性中设置 err = CheckCom.CheckMainTbValueBKAndUnique(listid, _maintbid, model, dtMain); if (string.IsNullOrEmpty(err)) { //进行主表自定义校验,自定义校验可在录入表管理/录入校验中设置 err = CheckCom.CheckMainTbValidate(dtMain, _flowid, prcno); if (string.IsNullOrEmpty(err)) { tbWarehousingOfGoods.GetModelDefault(model, CurrentUser); model.runName = BaseUtil.GetRunName(CurrentUser == null ? "!undefined" : CurrentUser.Account, _flowid, _tbname, dtMain);//得到名称 listid = tbWarehousingOfGoods.InsertReturnID(model); err = listid > 0 ? "" : "添加失败"; if (string.IsNullOrEmpty(err)) { Record.Add(CurrentUser == null ? "!undefined" : CurrentUser.Account, listid.ToString(), _flowid, "#新增数据#"); } } } return listid; } /// /// 编辑主子表数据listid不为0时被调用,可处理多个子表 /// 同时调用子表AfterGridEdit或AfterGridFinish事件 /// /// 主表数据 /// 子表数据列表 /// 主表自增长id:基础信息表对应主表listid,一般录入表对应表flowrunlist中的listid /// 当前流程步骤编码 /// 是否完成,确定调用AfterGridEdit或AfterGridFinish /// private string Edit(WarehousingOfGoodsModel model, IEnumerable gridlist, long listid, string prcno, string isFinish = "") { string err = ""; string updateFields;//可修改字段 List listWarehousingDetails = WarehousingDetailsService.CheckedAndGetList(gridlist, "", listid, ref err); if (string.IsNullOrEmpty(err)) { model.ListId = listid; DataTable dtMain = DataTableHelp.ModelToDataTable(model); //主键和唯一检测,可在录入表指标属性中设置 err = CheckCom.CheckMainTbValueBKAndUnique(listid, _maintbid, model, dtMain); if (string.IsNullOrEmpty(err)) { //自定义校验,可在录入表管理录入校验中设置 err = CheckCom.CheckTbValidate(dtMain, gridlist, _flowid, prcno); if (string.IsNullOrEmpty(err)) { //子表数据编辑 err += gridWarehousingDetails.SaveGrid(model, gridlist, listid, prcno, isFinish); if (!string.IsNullOrEmpty(err)) { return err; } updateFields = WarehousingOfGoodsService.GetUpdateFields(prcno);//可修改字段 if(!string.IsNullOrEmpty(updateFields)) { //编辑主表 err = tbWarehousingOfGoods.UpdateByWhere("where listid=" + listid + "", updateFields, model) > 0 ? "" : "编辑失败"; } Record.Add(CurrentUser == null ? "!undefined" : CurrentUser.Account, listid.ToString(), _flowid, "#编辑数据#"); } } } return err; } #endregion Form编辑页面 #region 子表处理 /// /// 子表获取数据,前端子表table.render调用此函数 /// /// 子表编码 /// 主表数据id /// add或edit,用于控制子表指标编辑时锁定 /// [HttpGet] public JsonResult GetGridList(string tbid, long listid, string from) { List list = null; try { if (tbid == "tb_WarehousingDetails") { list = gridWarehousingDetails.GetGridDataByListId(CurrentUser, listid, from); } var result = new { code = 0, msg = "", count = 999999, data = list }; return Json(result); } catch (Exception ex) { Record.AddErr(listid.ToString(), _flowid, "WarehousingOfGoodsController:GetGridList", ex); return Json(new { msg = ex.Message, count = -1 }); } } /// /// 子表添加一条数据,点击子表列表右侧添加按钮触发 /// /// 主表控件list,循环后得到model /// 子表数据列表(只取首行) /// 子表编码 /// 主表id:基础信息表对应主表listid,一般录入表对应表flowrunlist中的listid [HttpPost] public ActionResult AddGrid(long listid, string tbid, IEnumerable controlslist, IEnumerable list) { string err = ""; long newid = 0; try { WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModelByControlsList(controlslist); newid = this.AddGridItem(ref err, listid, tbid, model, list); } catch (Exception ex) { Record.AddErr(listid.ToString(), _flowid, "WarehousingOfGoodsController:AddGrid", ex); err += ex.Message; } if (newid > 0 && string.IsNullOrEmpty(err)) { return Json(SuccessTip("操作成功", newid.ToString())); } else { return Json(ErrorTip(err)); } } /// /// 子表插入空数据,点击子表列表上部新增行按钮触发 /// /// 主表控件list,循环后得到model /// 子表id /// 主表数据id /// [HttpPost] public ActionResult AddGridNull(IEnumerable controlslist, string grid, long listid) { string err = ""; long newid = listid; WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModelByControlsList(controlslist); if (listid == 0) { newid = tbWarehousingOfGoods.InsertEmptyReturnID(ref err, CurrentUser); } if (!string.IsNullOrEmpty(err) || newid == 0) { return Json(ErrorTip(err)); } if (grid == "tb_WarehousingDetails") { err = gridWarehousingDetails.AddGridNull(grid, newid, model);//子表插入空数据 } if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } else { return Json(SuccessTip("操作成功", newid.ToString())); } } /// ///子表删除一条数据,点击子表列表右侧删除按钮触发 /// /// 主表控件list,循环后得到model /// #子表编码#id#行号# /// 主表id:基础信息表对应主表listid,一般录入表对应表flowrunlist中的listid /// [HttpPost] public ActionResult DelGrid(IEnumerable controlslist, string flag, string listid) { string tbid = ""; string id = ""; string err = ""; WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModelByControlsList(controlslist); BasicHelp.GetTbAndIdByFlag(flag, ref tbid, ref id);//flag:#子表编码#id#行号# if (!string.IsNullOrEmpty(tbid) && !string.IsNullOrEmpty(id)) { if(tbid == "tb_WarehousingDetails") { err += gridWarehousingDetails.DelGrid(listid, id, CurrentUser, model); } if (string.IsNullOrEmpty(err)) { return Json(SuccessTip("删除成功")); } else { return Json(ErrorTip(err)); } } else { return Json(ErrorTip("参数错误")); } } /// /// 批量删除子表数据,点击子表列表上部删除按钮触发 /// /// 主表控件list,循环后得到model /// 主表数据主键 /// 子表id /// /// [HttpPost] public JsonResult BatchDelGrid(IEnumerable controlslist, string listid, string tbid, string idsStr) { string err = ""; WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModelByControlsList(controlslist); string id = ""; string[] arr = BaseUtil.GetStrArray(idsStr, ","); for (int i = 0; i < arr.GetLength(0); i++) { id = arr[i] == null ? "0" : arr[i].ToString(); if(tbid == "tb_WarehousingDetails") { err += gridWarehousingDetails.DelGrid(listid, id, CurrentUser, model); } } if (string.IsNullOrEmpty(err)) { return Json(SuccessTip("删除成功")); } else { return Json(ErrorTip(err)); } } /// /// 编辑子表数据,点击子表列表上部保存按钮触发 /// /// 主表控件list,循环后得到model /// 子表数据 /// 子表id /// 主表数据id /// 流程步骤编码 /// [HttpPost] public ActionResult EditGrid(IEnumerable controlslist, IEnumerable gridlist, long listid, string grid, string prcno) { string err = ""; WarehousingOfGoodsModel model = tbWarehousingOfGoods.GetModelByControlsList(controlslist); if (grid == "tb_WarehousingDetails") { List objList = WarehousingDetailsService.CheckedAndGetList(gridlist, "", listid, ref err); if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } if (objList.Count < 1) { return Json(SuccessTip(""));//无数据直接返回 } err = gridWarehousingDetails.SaveGrid(model, gridlist, listid, prcno, ""); } if (!string.IsNullOrEmpty(err)) { return Json(ErrorTip(err)); } else { return Json(SuccessTip("操作成功", listid.ToString())); } } /// /// 子表添加一条数据 /// /// 错误信息 /// 主表model /// 子表数据列表 /// 子表编码 /// 主表id:基础信息表对应主表listid,一般录入表对应表flowrunlist中的listid /// public long AddGridItem(ref string err, long listid, string tbid, WarehousingOfGoodsModel model, IEnumerable list, CurrentUserEntity user = null) { long newid = 0; user = user == null ? CurrentUser : user; if (tbid == "tb_WarehousingDetails") { List objList = WarehousingDetailsService.CheckedAndGetList(list, "#tb_WarehousingDetails#0#0#", listid, ref err); if (string.IsNullOrEmpty(err)) { if (listid == 0) { newid = tbWarehousingOfGoods.InsertEmptyReturnID(ref err, user); } else { newid = listid; } if (newid > 0) { err = gridWarehousingDetails.AddGrid(model, list, newid); } else { err = "主表插入数据错误"; } } } return newid; } #endregion 子表处理 #region 弹出处理--文本框设置了数据规范(单列、多列或树形选择),点击文本框将弹出页面 /// /// 统一处理弹出数据选择页面,如果文本框设置了数据规范(单列、多列或树形选择),点击文本框将被触发 /// /// _main或子表编码 /// 触发弹出页面的指标编码 /// 子表数据列表id或空 /// 子表哪一列触发如v1、v2 /// list或edit,list时会自动解除条件参数中包含的系统指标,如用户登录名等 /// [HttpGet] public ActionResult PopUpPage(string tbid, string indexid, string id, string strv, string from) { object param = BasicHelp.GetParamObject(CurrentUser); ViewBag.PuTbId = tbid == null ? "" : tbid; ViewBag.PuIndexId = indexid == null ? "" : indexid; ViewBag.PuId = id == null ? "" : id; ViewBag.PuV = strv == null ? "" : strv.Replace("v",""); ViewBag.PuFrom = from == null ? "" : from; //弹出页面的查询条件有下拉选择时,为其绑定动态数据源 ViewBag.SelectList = tbWarehousingOfGoods.GetSelectList(tbid, indexid, from, param); return View("Grid_" + indexid); } /// /// 统一处理弹出页面获得数据列表 /// /// 页面信息,包括行数、排序等 /// 主表触发时为指标编码,子表触发时为子表编码+指标编码 /// 封装查询条件 /// [HttpPost] public ActionResult GetPopUpPageList(PageInfoEntity pageInfo, string indexid, string from, IEnumerable list) { long total = 0; try { IEnumerable _list = tbWarehousingOfGoods.GetPopUpListForPage(ref total, pageInfo, indexid, from, list, CurrentUser); if (_list == null) { return Json(new { msg = "参数错误", count = -1 }); } else { return Json(new { code = 0, msg = "", count = total, data = _list }); } } catch (Exception ex) { Record.AddErr("", _flowid, "WarehousingOfGoodsController:GetPopUpPageList", ex); return Json(new { msg = "Err:
" + ex.Message, count = -1 }); } } /// /// 弹出页面点击确定后统一调用,默认什么也不做 /// /// _main或子表编码 /// 触发弹出页面的指标编码,主表时为指标编码,子表时为子表编码+指标编码 /// 子表数据列表id或空 /// 选择的值 /// 子表弹出时使用,第几列 /// [HttpPost] public ActionResult AfterPopUpSelect(string tbid, string indexid, string id, string value, string v) { //默认什么也不做--可自定义 if (tbid == "_main")//主表 { //自定义 如 //if (indexid == "xxx") //{ //} } else//子表 { //自定义 如 //if (indexid == "xxx") //{ //} } return Json(""); } #endregion 弹出处理--文本框设置了数据规范(单列、多列或树形选择),点击文本框将弹出页面 } } ``` ``` @*YoursLC有源低代码 Create:admin 2023-08-01 11:22:45 添加或编辑-此文件放置于Views/WarehousingOfGoods /中*@ @using Think9.Models; @*@model Think9.Models.WarehousingOfGoodsModel;*@ @{ ViewBag.Title = "Add"; Layout = "~/Areas/Shared/_LayuiForm.cshtml"; } @*货品入库 ---录入表样式按照默认方式一行两列生成,可能是因为未设计表单样式*@
@*debug为调试;release为发布*@ @*多选框字符分割*@ @*从哪里跳转来的?默认list*@ @*add或edit*@ @*用户id*@ @*附件id*@ @*当前流程编码*@ @*当前流程步骤id*@ @*当前流程步骤编码*@ @*弹出选择时页面间传递数据*@ @*弹出选择时使用-弹出页面选择的值*@ @*弹出选择时使用-触发弹出页面的表id,_main或子表编码*@ @*弹出选择时使用-触发弹出页面的指标编码*@ @*弹出选择时使用-子表弹出,对应tableid 哪一行*@ @*弹出选择时使用-子表弹出,第几列*@
@*打印*@ @**@ @**@
``` ``` /** * Create:admin 2023-08-01 11:22:46 * description:YoursLC有源低代码 自定义扩展 此文件放置于wwwroot/self_js文件夹中 */ layui.define(['jquery', 'table'], function (exports) { let table = layui.table; let $ = layui.$; var api = { //编辑时锁定 lockForEditing: function (_type) { }, searchShow: function () { var display = $('#searchfield').css('display'); if (display == 'none') { $("#searchfield").show(); document.body.scrollTop = document.documentElement.scrollTop = 0; } else { $("#searchfield").hide(); } }, //控制list页面按钮状态 setListButDisable: function (strDisable) { layui.device().mobile ? $("#batchDel").html('删除') : $("#batchDel").html('批量删除'); if (strDisable == 'all' || strDisable.indexOf("[batchDel]") > -1) { $("#batchDel").attr("class", "layui-btn layui-btn-disabled layui-btn-sm");//禁用批量删除 $("#batchDel").removeAttr("lay-event"); } layui.device().mobile ? $("#mergeExport").html('导出') : $("#mergeExport").html('合并导出'); if (strDisable == 'all' || strDisable.indexOf("[mergeExport]") > -1) { $("#mergeExport").attr("class", "layui-btn layui-btn-disabled layui-btn-sm");//禁用批量导出 $("#mergeExport").removeAttr("lay-event"); } layui.device().mobile ? $("#importExcel").html('导入') : $("#importExcel").html('数据导入'); if (strDisable == 'all' || strDisable.indexOf("[importExcel]") > -1) { $("#importExcel").attr("class", "layui-btn layui-btn-disabled layui-btn-sm");//禁用数据导入 $("#importExcel").removeAttr("lay-event"); } layui.device().mobile ? $("#add").html('新增') : $("#add").html('新增数据'); if (strDisable == 'all' || strDisable.indexOf("[add]") > -1) { $("#add").attr("class", "layui-btn layui-btn-disabled layui-btn-sm");//禁用数据新增 $("#add").removeAttr("lay-event"); } }, //控制form页面按钮状态 setFormButDisable: function (strDisable) { if (strDisable == 'all' || strDisable.indexOf("[print]") > -1) { $("#print").attr("class", "layui-btn layui-btn-disabled");//禁用打印 $("#print").removeAttr("href"); } if (strDisable == 'all' || strDisable.indexOf("[att]") > -1) { $("#att").attr("class", "layui-btn layui-btn-disabled");//禁用附件 $('#att').unbind('click'); } if (strDisable == 'all' || strDisable.indexOf("[edit]") > -1) { $("#edit").attr("class", "layui-btn layui-btn-disabled");//禁用保存 $("#edit").removeAttr("lay-filter"); } if (strDisable == 'all' || strDisable.indexOf("[next]") > -1) { $("#next").attr("class", "layui-btn layui-btn-disabled");//禁用转交 $("#next").removeAttr("lay-filter"); } if (strDisable == 'all' || strDisable.indexOf("[finish]") > -1) { $("#finish").attr("class", "layui-btn layui-btn-disabled");//禁用结束 $("#finish").removeAttr("lay-filter"); } }, //导出文件 downFile: function (url, fileName) { var xhr = new XMLHttpRequest(); xhr.open('post', url, true); xhr.responseType = "blob";// 返回类型blob xhr.onload = function () { if (this.status === 200) { var blob = this.response; var reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = function (e) { var a = document.createElement('a'); a.download = fileName; a.href = e.target.result; $("body").append(a); // 修复firefox中无法触发click a.click(); $(a).remove(); } } }; xhr.send() }, //将所有主表控件(ID、Value和ControlType)Push到list中 getControlValueList: function () { var _list = []; _list.push({ ControlID: 'listid', ControlValue: $('#_listid').val(), ControlType: '1' });//listid _list.push({ ControlID: 'inRKDH', ControlValue: $('#inRKDH').val(), ControlType: '1' });//入库单号 _list.push({ ControlID: 'inRKRQ', ControlValue: $('#inRKRQ').val(), ControlType: '1' });//入库日期 _list.push({ ControlID: 'inRKLX', ControlValue: $('#inRKLX').val(), ControlType: '2' });//入库类型 _list.push({ ControlID: 'inCK', ControlValue: $('#inCK').val(), ControlType: '2' });//仓库 _list.push({ ControlID: 'inZDR', ControlValue: $('#inZDR').val(), ControlType: '1' });//制单人 _list.push({ ControlID: 'inXGDW', ControlValue: $('#inXGDW').val(), ControlType: '2' });//相关单位 _list.push({ ControlID: 'inJE', ControlValue: $('#inJE').val(), ControlType: '1' });//金额 _list.push({ ControlID: 'inSHZT', ControlValue: $('#inSHZT').val(), ControlType: '2' });//审核状态 _list.push({ ControlID: 'inCGDH', ControlValue: $('#inCGDH').val(), ControlType: '1' });//采购单号 _list.push({ ControlID: 'inBZ', ControlValue: $('#inBZ').val(), ControlType: '1' });//备注 return _list; }, //固定流程时根据流程编码设置控件读写状态 setStateByFlow: function (prcno) { //无流程 }, //执行数据读取--使用后台返回的lists,为控件赋值 setValueByList: function (lists) { //主表 if ($('#pu_tbid').val() == '_main') { for (var item in lists) { var _value = lists[item].ControlValue; var _id = lists[item].ControlID; var _type = lists[item].ControlType; var _list = lists[item].ListValue; if (_list == null) { //读取单值 //text文本框 if (_type == "1") { $("#" + _id).val(_value); } //select下拉选择 if (_type == "2") { $("select[name=" + _id + "]").val(_value); /* $("#" + _id).val(_value);*/ } //checkbox复选框 if (_type == "3") { } //radio单选框 if (_type == "4") { $("input[name=" + _id + "]" + "[value='" + _value + "']").prop('checked', 'checked'); } //img图片 if (_type == "5") { } } else { //数据联动 var _controlid = "#" + _id; $("" + _controlid + "").empty(); //清空控件 if (_type == "2") { $("" + _controlid + "").append(new Option('==请选择==', '')); } $.each(_list, function (i, item) { $("" + _controlid + "").append(new Option(item.Text, item.Value)); }); } } } else {//子表 var _starts = "#" + $('#pu_tbid').val() + "#" + $('#pu_rowid').val() + "#"; var trList = $(".layui-table").find("tr"); for (var i = 0; i < trList.length; i++) { var tdArr = trList.eq(i).find("td"); if (tdArr.eq(0).text().startsWith(_starts) && $('#pu_tbid').val() == 'tb_WarehousingDetails') { for (var item in lists) { var _list = lists[item].ListValue; var _value = lists[item].ControlValue; var _id = lists[item].ControlID.replace("v", "");//列序号如1、2、3... if (_list == null) { //读取单值 if (lists[item].ControlType == "2") { tdArr.eq(parseInt(_id)).find('select').val(_value);//下拉选择 } else { tdArr.eq(parseInt(_id)).find('input').val(_value); } } else { //数据联动 if (lists[item].ControlType == "2") { tdArr.eq(parseInt(_id)).find('select').empty(); $.each(_list, function (i, item) { tdArr.eq(parseInt(_id)).find('select').append(new Option(item.Text, item.Value)); }); } } } } } } }, //弹出选择触发--弹出页面关闭后,将选择的Value赋值给触发弹出页面的input getValueFromPopUp: function (tbid, indexid, id) { var _tbid = $('#pu_tbid').val();//表id,主表为_main var _id = $('#pu_rowid').val();//子表数据主键 var _indexid = $('#pu_indexid').val();//指标编码 var _v = $('#pu_column').val();//第几列--子表弹出时有用 var _value = $('#pu_value').val();//弹出页面选择的值 var flag = ''; if (_tbid == '_main') { $("#" + _indexid + "").val(_value); } else { var flag = ''; var _starts = "#" + _tbid + "#" + _id + "#"; var trList = $(".layui-table").find("tr"); for (var i = 0; i < trList.length; i++) { var tdArr = trList.eq(i).find("td"); flag = tdArr.eq(0).text(); if (flag.startsWith(_starts) && _tbid == 'tb_WarehousingDetails') { tdArr.eq(parseInt(_v)).find('input').val(_value); } } } }, //某个子表table首行取数--增加行的Grid getFirstGridTable: function () { var _list = []; var trList = $(".layui-table").find("tr"); //获取table下的所有tr for (var i = 0; i < trList.length; i++) { //遍历所有的tr var tdArr = trList.eq(i).find("td"); //获取该tr下的所有td var flag = tdArr.eq(0).text(); if (flag.startsWith('#tb_WarehousingDetails#') && flag.substr(-3) == '#0#') { var _row = {}; _row.flag = flag; _row.v1 = tdArr.eq(1).find('input').val();//编码 _row.v2 = tdArr.eq(2).find('input').val();//名称 _row.v3 = tdArr.eq(3).find('input').val();//规格 _row.v4 = tdArr.eq(4).find('select').val();//单位 _row.v5 = tdArr.eq(5).find('input').val();//单价 _row.v6 = tdArr.eq(6).find('input').val();//数量 _row.v7 = tdArr.eq(7).find('input').val();//金额 _row.v8 = tdArr.eq(8).find('input').val();//备注 _list.push(_row); } } return _list; }, //某个子表table取数 getCurrentGridTable: function (tbid, id) { var _list = []; var trList = $(".layui-table").find("tr"); //获取table下的所有tr for (var i = 0; i < trList.length; i++) { //遍历所有的tr var tdArr = trList.eq(i).find("td"); //获取该tr下的所有td var flag = tdArr.eq(0).text(); if (flag.startsWith('#tb_WarehousingDetails#' + id + '#') && tbid == 'tb_WarehousingDetails') { var _row = {}; _row.flag = flag; _row.v1 = tdArr.eq(1).find('input').val();//编码 _row.v2 = tdArr.eq(2).find('input').val();//名称 _row.v3 = tdArr.eq(3).find('input').val();//规格 _row.v4 = tdArr.eq(4).find('select').val();//单位 _row.v5 = tdArr.eq(5).find('input').val();//单价 _row.v6 = tdArr.eq(6).find('input').val();//数量 _row.v7 = tdArr.eq(7).find('input').val();//金额 _row.v8 = tdArr.eq(8).find('input').val();//备注 _list.push(_row); } } return _list; }, //遍历子表table取数--可从多个子表取值 foreachGridTable: function () { var _list = []; var trList = $(".layui-table").find("tr"); //获取table下的所有tr for (var i = 0; i < trList.length; i++) { //遍历所有的tr var tdArr = trList.eq(i).find("td"); //获取该tr下的所有td var flag = tdArr.eq(0).text(); if (flag.startsWith('#tb_WarehousingDetails#')) { var _row = {}; _row.flag = flag; _row.v1 = tdArr.eq(1).find('input').val();//编码 _row.v2 = tdArr.eq(2).find('input').val();//名称 _row.v3 = tdArr.eq(3).find('input').val();//规格 _row.v4 = tdArr.eq(4).find('select').val();//单位 _row.v5 = tdArr.eq(5).find('input').val();//单价 _row.v6 = tdArr.eq(6).find('input').val();//数量 _row.v7 = tdArr.eq(7).find('input').val();//金额 _row.v8 = tdArr.eq(8).find('input').val();//备注 _list.push(_row); } } return _list; }, //设置子表不可编辑 setGridDisabled: function (grid) { var trList = $(".layui-table").find("tr"); //获取table下的所有tr for (var i = 0; i < trList.length; i++) { //遍历所有的tr var tdArr = trList.eq(i).find("td"); //获取该tr下的所有td var flag = tdArr.eq(0).text(); if (flag.startsWith('#tb_WarehousingDetails#') && grid == 'tb_WarehousingDetails') { tdArr.eq(1).find('input').attr('disabled', 'disabled');//编码 tdArr.eq(2).find('input').attr('disabled', 'disabled');//名称 tdArr.eq(3).find('input').attr('disabled', 'disabled');//规格 tdArr.eq(4).find('select').attr('disabled', 'disabled');//单位 tdArr.eq(5).find('input').attr('disabled', 'disabled');//单价 tdArr.eq(6).find('input').attr('disabled', 'disabled');//数量 tdArr.eq(7).find('input').attr('disabled', 'disabled');//金额 tdArr.eq(8).find('input').attr('disabled', 'disabled');//备注 tdArr.eq(9).find('button').attr('disabled', 'disabled');//右侧添加删除按钮 tdArr.eq(9).find('button').attr('class', 'layui-btn layui-btn-disabled layui-btn-xs'); tdArr.eq(9).find('button').removeAttr('lay-event'); } } } }; //暴露接口 exports('WarehousingOfGoods', api); }); ``` #### 说明 除Think9.CreatCode.dll和Think9.Settings.dll(这两个模块处理代码生成和自定义设置功能)其余代码全部开源 YoursLC有源低代码包括免费版和收费版,免费版会有部分功能限制,如需收费版,联系qq:576463026 讨论交流QQ群(937494747)