# 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应用、修改源码和调试代码;
- **开发版使用发布模式无需替换代码也能按照最新设置运行程序,可查看运行效果,最后一键生成源码,然后再启用调式模式进行代码调试和修改** ,如此可大大提高开发效率
#### 功能截图
移动端增强功能,自动生成适配移动端的页面

【数据规范】为录入表指标指定数据规范,可实现自动填写(为文本框赋值)、选择输入(为下拉框、弹出选择设置数据源),包括自动编号、单列选择、多列选择、树形选择

【录入指标】录入表的录入项,对应数据表的字段和实体类属性。定义录入表(主表)需首先定义录入指标

【自定义录入表步骤】 1:新建主表;2:为主表添加指标并设置指标属性及数据规范;3:为主表添加子表(可选);4:创建数据表;5:设置自定义事件、数据读取、页面按钮等...;6:表单设计;7:为录入表添加菜单;8:重新生成查看运行效果;9:代码生成并调试测试(需启动调试模式);10:修改、测试并发布

【自定义事件】可对主表的AfterAdd、AfterEdit、AfterFinish、AfterDelete,子表的AfterGridAdd、AfterGridEdit、AfterGridDel事件进行自定义,以上事件分别在添加完成、编辑完成、删除完成后被调用;通过自定义包含参数的sql语句或调用已定义的存储过程,对数据表进行新增、编辑、删除操作,实现数据同步等目的

【数据读取】数据读取包括三类:1:读取单值,如选择产品后为产品名称、计量单位等控件赋值;2:读取列表值,为下拉选择赋值,如实现数据联动; 3:自动读取其他录入表数据为子表赋值(更新子表数据)

【表单设计】

【数据回写】在指定的条件下(适用范围)按照设定的规则对满足条件的录入表数据进行修改

【自定义统计报表】可通过两种方式创建统计表:1.基于录入表(视图)创建,统计表的列来源于录入表(视图)或自定义的统计指标;2.一般方式创建,可以自由设置统计表的单元格,单元格可以为自定义的统计指标(参数)或字符
基于录入表(视图)创建,需为统计表指定显示列、查询字段和排序字段等;一般方式创建统计表步骤: 1.新建统计表; 2.编辑行列--将单元格设置为自定义的统计指标或字符(如果统计指标包含条件参数需为条件参数赋值); 3.定义动态行,实现行统计表行的自增长; 4.定义查询参数(非必须); 5:为统计表添加菜单;6:【启动发布模式】查看效果;7:代码生成并调试测试(需【启动调试模式】)
统计表基于rdlc报表创建,可使用rdlc报表编辑器在数据列表上添加各类图表

【重新生成】重新生成后,将自动【启动发布模式】,【启动发布模式】无需替换代码也能按照最新设置运行程序

【生成代码并下载】下载后,参看说明将文件按要求放置,并启动调试模式,【启动调试模式】可使用代码调式功能

#### 生成的代码(无手写)
以下代码全部自动生成,无一行手写
```
/*******************************************************************************
* 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"; }
@*货品入库 ---录入表样式按照默认方式一行两列生成,可能是因为未设计表单样式*@
```
```
/**
* 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)