首页
喃喃低语
Search
1
【023】新增客开参数设置
36 阅读
2
平台领域应用合集 - U9HUB
26 阅读
3
【052】查找DataAccess的DLL路径获取密码
26 阅读
4
【056】使用警告弹窗提示用户信息
22 阅读
5
【050】客开补丁加补丁说明
21 阅读
用友U9
登录
Search
秋驰雪隙
累计撰写
60
篇文章
累计收到
2
条评论
首页
栏目
用友U9
页面
喃喃低语
搜索到
60
篇与
秋驰雪隙
的结果
2025-04-08
【049】应收单UI插件触发修改联动
应收单UI插件触发修改联动应收单的UI插件中,对单价、金额、数量进行赋值,并不会联动其它的值的修改。而且也没有相对应的方法进行调用,经反编译调试研究,使用以下解决方案反射调用SetBatchPasteDatacurPart为UI插件中获取到的强类型private ARMainUIFormWebPart curPart SetBatchPasteData函数就是批量粘贴值的处理方法,内部会对粘贴后的值进行其他值的联动处理 srcColumnField就是粘贴列,触发源头 SetBatchPasteData只会修改核币相关的其他值/// <summary> /// 通过调用批量粘贴值的方法,达到值变化的目的 /// </summary> /// <param name="line">粘贴的行</param> /// <param name="srcColumnField">PUAmount、TaxPrice、NonTaxPrice、AROCMoney_NonTax、AROCMoneyPriceTaxSum、AROCMoney_GoodsTax</param> /// <param name="Pastevalue">值</param> /// <param name="roundHelperACMoney">核币金额精度</param> /// <param name="roundHelperACPrice">核币单价精度</param> /// <param name="modifiedLineIds">要同步修改的行ID集合</param> /// <param name="isTaxPrice">是否含税</param> /// <param name="head">应收单头</param> private void SetBatchPasteData(ARBillHead_ARBillLinesRecord line, string srcColumnField, string Pastevalue, RoundHelper roundHelperACMoney, RoundHelper roundHelperACPrice, List<long> modifiedLineIds, bool isTaxPrice, ARBillHeadRecord head) { // 获取类型 Type type = curPart.GetType(); // 获取方法信息 MethodInfo methodInfo = type.GetMethod("SetBatchPasteData", BindingFlags.NonPublic | BindingFlags.Instance); // 调用方法,传递参数 methodInfo.Invoke(curPart, new object[] { line, srcColumnField, Pastevalue, roundHelperACMoney, roundHelperACPrice, modifiedLineIds, isTaxPrice, head, null }); }反射调用CalcFCMoneyFromACMoneySetBatchPasteData只会修改核币相关的其他值,所以需要CalcFCMoneyFromACMoney根据核币金额重算本币金额 第二个参数是是否重算所有行,如果只是重算特定行,要保证那一行是焦点行,因为方法内部就是获取焦点行 注意,应收单审核后此方法就不会执行了(但是SetBatchPasteData是会执行的,所以保存的时候会报错本币金额与核币金额不一致)/// <summary> /// 根据核币金额计算本币金额 /// </summary> /// <param name="head">应收单头</param> /// <param name="allLineCalc">是否重算全部行</param> private void CalcFCMoneyFromACMoney(ARBillHeadRecord head, bool allLineCalc) { // 获取类型 Type type = curPart.Action.GetType(); // 获取方法信息 MethodInfo methodInfo = type.GetMethod("CalcFCMoneyFromACMoney", BindingFlags.NonPublic | BindingFlags.Instance); // 调用方法,传递参数 methodInfo.Invoke(curPart.Action, new object[] { head, allLineCalc }); }案列:折扣计算对应收单进行折扣计算 应收单行扩展字段:3s折扣前价税合计、4s折扣前未税金额、5s折扣前税额、6s折扣金额、7s折扣率、8s折扣前含税单价应收单折扣计算 ARMainUIFormUIPlugIn.cs
2025年04月08日
8 阅读
0 评论
0 点赞
2025-04-08
【048】转总账运用自定义函数排除不查询的ID
编写自定义函数sqlGetTransEntryHeadFailureCREATE FUNCTION dbo.sqlGetTransEntryHeadFailure() RETURNS @ResultTable TABLE ( ID bigint ) AS BEGIN -- Add the SELECT statement with parameter references here -- 函数中可以把需要处理的ID通过条件查询出来 INSERT INTO @ResultTable SELECT 1002402280000120 ID union all SELECT 1002402280000309 ID RETURN; END GO插入函数表insert into Base_ExpFunction values(2024092001, GETDATE(), 'EA', null, null, 0, 'sqlGetTransEntryHeadFailure', 11, null,0,0); insert into Base_ExpFunction_Trl values(2024092001, 'zh-CN', N'取支付失败的交易分录头ID');打开portal/bin下面Script.xml文件ubfScript.xml(U9内部使用) 或 Script.xml(客开第三方使用) 将刚刚新增的函数增加一条配置,在文件的最后面(/function-binding节点前)增加自定义函数的节点<sql name="sqlGetTransEntryHeadFailure" method="sqlGetTransEntryHeadFailure" owner="dbo"/>重启IIS重启IIS后既可在公式设计器使用转总账运用自定义函数排除不查询的ID
2025年04月08日
12 阅读
0 评论
0 点赞
2025-04-08
【047】在 SQL Server 中查询锁表的表名
锁表进程查询与释放select request_session_id 锁表进程,OBJECT_NAME(resource_associated_entity_id) 被锁表名 from sys.dm_tran_locks where resource_type='OBJECT' and OBJECT_NAME(resource_associated_entity_id) is not null order by request_session_id -- kill 74 --进程ID详细信息select t1.resource_type [资源锁定类型] , DB_NAME(resource_database_id) as 数据库名 , t1.resource_associated_entity_id 锁定对象 , t1.request_mode as 等待者请求的锁定模式 , t1.request_session_id 等待者SID , t2.wait_duration_ms 等待时间 , (select TEXT from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text(r.sql_handle) where r.session_id = t1.request_session_id) as 等待者要执行的SQL , t2.blocking_session_id [锁定者SID] , (select TEXT from sys.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) where p.spid = t2.blocking_session_id ) 锁定者执行语句 from sys.dm_tran_locks t1, sys.dm_os_waiting_tasks t2 where t1.lock_owner_address = t2.resource_address通过查询器查询当前慢SQLSELECT TOP (100) (qs.total_elapsed_time/qs.execution_count)/1000 N'平均时间ms' ,qs.total_elapsed_time/1000 N'总花费时间ms' ,qs.total_worker_time/1000 N'所用的CPU总时间ms' ,qs.total_physical_reads N'物理读取总次数' ,qs.total_logical_reads/qs.execution_count N'每次逻辑读次数' ,qs.total_logical_reads N'逻辑读取总次数' ,qs.total_logical_writes N'逻辑写入总次数' ,qs.execution_count N'执行次数' ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) N'执行语句' ,qs.creation_time N'语句编译时间' ,qs.last_execution_time N'上次执行时间' FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY qs.total_elapsed_time/qs.execution_count DESC;
2025年04月08日
13 阅读
0 评论
0 点赞
2025-04-08
【046】列表删除
父子表结构的客开档案,制作好列表之后,列表查询方案把子表列拉出来点击删除会报错private void OnDelete_Extend(object sender, UIActionEventArgs e) { Hashtable MyHT = new Hashtable(); foreach (IUIRecord CurSelectRcd in UIRuntimeHelper.Instance.GetSelectRecordFromCache(this.MainView)) { if (CurSelectRcd["ID"] != CurSelectRcd["MainID"]) { if (!MyHT.ContainsKey(CurSelectRcd["MainID"].ToString())) { MyHT.Add(CurSelectRcd["MainID"].ToString(), CurSelectRcd); CurSelectRcd["ID"] = CurSelectRcd["MainID"]; CurSelectRcd.IsSelected = true; } else { CurSelectRcd.IsSelected = false; } } } //调用模版定义的默认实现方法.如需扩展,请直接在此编程. this.OnDelete_DefaultImpl(sender, e); UFSoft.UBF.UI.ControlModel.IUFDataGrid UIGrid = this.CurrentPart.GetUFControlByName(this.CurrentPart.TopLevelContainer, "DataGrid1") as UFSoft.UBF.UI.ControlModel.IUFDataGrid; this.NavigateAction.Refresh(UIGrid); }
2025年04月08日
10 阅读
0 评论
0 点赞
2025-04-08
【045】打印模板
U9打印模板集团汇总帮助文档有道云笔记 (【打印】操作手册及解决方案合集)模板导入导出【打印】模板导出导入 - U9HUB (diwork.com)打印宝典U9打印宝典备份U9打印宝典副本-20240613
2025年04月08日
11 阅读
0 评论
0 点赞
2025-04-08
【044】https访问U9接口报错
报错信息如下解决方式web service接口Services目录下找到访问接口的同名配置文件(没有同名配置文件找公共配置web.config),参考以下配置:<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="U9SrvTypeBehaviors"> <serviceMetadata httpsGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="UFIDA.U9.Sn.BatchCreateSnSVStub" behaviorConfiguration="U9SrvTypeBehaviors"> <endpoint contract="UFIDA.U9.Sn.IBatchCreateSnSV" binding="basicHttpBinding" /> </service> </services> <bindings> <basicHttpBinding> <binding> <security mode="Transport"></security> </binding> </basicHttpBinding> </bindings> </system.serviceModel> </configuration>轻量型接口RestServicesRestServices目录下找到访问接口的同名配置文件(没有同名配置文件找公共配置web.config),参考以下配置:<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="U9SrvTypeBehaviors"> <serviceMetadata httpsGetEnabled="true"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="U9RestSrvBehaviors"> <enableWebScript /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="UFIDA.U9.Cust.HZM.DataCollection.TokenSV.GetTokenServiceStub" behaviorConfiguration="U9SrvTypeBehaviors"> <endpoint address="" behaviorConfiguration="U9RestSrvBehaviors" binding="webHttpBinding" contract="UFIDA.U9.Cust.HZM.DataCollection.TokenSV.IGetTokenService" /> </service> </services> <bindings> <webHttpBinding> <binding> <security mode="Transport"></security> </binding> </webHttpBinding> </bindings> </system.serviceModel> </configuration>
2025年04月08日
13 阅读
0 评论
0 点赞
2025-04-08
【043】多语言表字符串处理fn_GetCombineName
if(OBJECT_ID('fn_GetCombineName') is not null) drop function fn_GetCombineName go CREATE FUNCTION [dbo].[fn_GetSegName] ( @CombineName nvarchar(max), @SplitStr nvarchar(50), @SegIndex int ) RETURNS nvarchar(max) AS BEGIN --如果组合名称自身为空,则返回空串 if (@CombineName is null or @CombineName='') return '' declare @Result nvarchar(max) declare @x nvarchar(max) select @x=@CombineName select @x=replace(@x,' ',' ') select @x=replace(@x,'',' ') declare @curIndex int declare @i int set @i=1 WHILE @i<=@SegIndex BEGIN set @curIndex=charIndex(@SplitStr,@x,0) if @curIndex=0 BEGIN if (@i=@SegIndex) set @result=@x else set @result='' break END set @result=left(@x,@curIndex-1) if (@i=@SegIndex) break --准备下次循环 set @x=right(@x,len(@x)-len(@result)-len(@SplitStr)) set @i=@i+1 END return @Result END
2025年04月08日
10 阅读
0 评论
0 点赞
2025-04-08
【042】UI界面的一些通用代码
设置状态按钮的水印参考:【003】U9状态按钮水印效果列表跳转private void BtnList_Click_Extend(object sender, EventArgs e) { this.Action.CurrentPart.NavigatePage("列表的URL", null); }开启个性化public void AfterCreateChildControls() { UFIDA.U9.UI.PDHelper.PersonalizationHelper.SetPersonalizationEnable(this, true); }查找代码private void BtnFind_Click_Extend(object sender, EventArgs e) { if (!string.IsNullOrEmpty(wpFindID.Value)) this.Action.NavigateAction.MovePageAt(null, long.Parse(wpFindID.Value)); } public void AfterCreateChildControls() { PDFormMessage.ShowConfirmDialog(this.Page, "d6553293-1bfa-4443-9920-630fba59a428", Title, wpFindID.ClientID, this.BtnFind); }移除选中行private void RemoveSelectLine() { var selectRecords = this.Model.MainView.SelectRecords; if (selectRecords?.Count > 0) { foreach (var item in selectRecords) { if (item.PrimaryKey > 0) item.DataRecordState = DataRowState.Deleted; else this.Model.MainView.Records.Remove(item); } } }公共方法public class CommonVoid { /// <summary> /// 获取值集ID /// </summary> /// <param name="code">值集编码</param> /// <returns></returns> public static long GetValueSetDefID(string code) { string sql = $"select ID,Code from Base_ValueSetDef where Code='{code}'"; DataAccessor.RunSQL(DataAccessor.GetConn(), sql, null, out object obj); if (obj == null) return -1; long.TryParse(obj.ToString(), out long valueSetDef); return valueSetDef; } public static decimal ConvertToDecimal(object o) { decimal v; decimal.TryParse(o?.ToString(), out v); return v; } public static long ConvertToInt64(object o) { long v; long.TryParse(o?.ToString(), out v); return v; } public static int ConvertToInt32(object o) { int v; int.TryParse(o?.ToString(), out v); return v; } public static DateTime? ConvertToDateTime(object o) { if (o == null) return null; DateTime v; if (DateTime.TryParse(o?.ToString(), out v) == false) return null; return v; } public static string ConvertToString(object o) { return o?.ToString(); } /// <summary> /// 按钮启用/禁用 /// </summary> /// <param name="enabled">true 启用,false 禁用</param> /// <param name="btns"></param> public static void UFButtonEnabled(bool enabled, params IUFButton[] btns) { foreach (var btn in btns) { btn.Enabled = enabled; } } /// <summary> /// 控件只读/可编辑 /// </summary> /// <param name="readOnly">true 只读,fasel 可编辑</param> /// <param name="controls"></param> public static void ControlReadOnly(bool readOnly, params IUFControl[] controls) { foreach (IUFControl control in controls) { (control as IUIFieldBindingDataBindControl).ReadOnly = readOnly; } } public static void ShowAlertMessage(IPart part, string theMessage) { BaseWebForm webPart = part as BaseWebForm; if (webPart == null) return; string alertScript = GetAlertScript(theMessage); AtlasHelper.RegisterAtlasStartupScript(webPart.Page, webPart.Page.GetType(), Guid.NewGuid().ToString(), alertScript, false); } private static string GetAlertScript(string theMessage) { theMessage = ReplaceLawlessCharForShowAlertScript(theMessage); return ("<script language=\"javascript\">\n alert('" + theMessage + "'); </script>\n"); } private static string ReplaceLawlessCharForShowAlertScript(string message) { message = message.Replace(@"\r", "\r"); message = message.Replace(@"\n", "\n"); message = message.Replace("\r", @"\r"); message = message.Replace("\n", @"\n"); return message; } public static void ShowConfirmMessage(IPart part, string theMessage) { BaseWebForm webPart = part as BaseWebForm; if (webPart == null) return; string ConfirmScript = GetConfirmScript(theMessage); AtlasHelper.RegisterAtlasStartupScript(webPart.Page, webPart.Page.GetType(), Guid.NewGuid().ToString(), ConfirmScript, false); } private static string GetConfirmScript(string theMessage) { theMessage = ReplaceLawlessCharForShowAlertScript(theMessage); return ("<script language=\"javascript\">\n Confirm('" + theMessage + "'); </script>\n"); } /// <summary> /// 设置控件在卡片容器中的布局 /// </summary> /// <param name="container">卡片容器</param> /// <param name="ctrl">增加的控件</param> /// <param name="x">布局横坐标</param> /// <param name="y">布局纵坐标</param> public static void Layout(UFSoft.UBF.UI.ControlModel.IContainer container, IUFControl ctrl, uint x, uint y) { Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(0), Unit.Pixel(0), true); } /// <summary> /// 设置控件在卡片容器中的布局 /// </summary> /// <param name="container">卡片容器</param> /// <param name="ctrl">增加的控件</param> /// <param name="x">布局横坐标</param> /// <param name="y">布局纵坐标</param> /// <param name="width">控件宽</param> /// <param name="height">控件高</param> public static void Layout(UFSoft.UBF.UI.ControlModel.IContainer container, IUFControl ctrl, uint x, uint y, int width, int height) { Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(width), Unit.Pixel(height), false); } /// <summary> /// 设置控件在卡片容器中的布局 /// </summary> /// <param name="container">卡片容器</param> /// <param name="ctrl">增加的控件</param> /// <param name="x">布局横坐标</param> /// <param name="y">布局纵坐标</param> /// <param name="xspan">单元格横向跨度</param> /// <param name="yspan">单元格纵向跨度</param> /// <param name="width">控件宽</param> /// <param name="height">控件高</param> /// <param name="isAutoSize">是否自适应大小</param> public static void Layout(UFSoft.UBF.UI.ControlModel.IContainer container, IUFControl ctrl, uint x, uint y, int xspan, int yspan, Unit width, Unit height, bool isAutoSize) { IGridLayout gl = container.Layout as IGridLayout; if (gl == null) return; GridLayoutInfo glInfo = new GridLayoutInfo(x, y, (uint)xspan, (uint)yspan, width, height); glInfo.AutoSize = isAutoSize; gl.Controls.Add((Control)ctrl, glInfo); } /// <summary> /// 在父容器中查找控件 /// </summary> /// <param name="parentControl">父容器</param> /// <param name="control">控件</param> /// <returns>找到的控件</returns> public static IUFControl FindControl(IPart part, string parentControl, string control) { IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, parentControl); if (card == null) return null; foreach (IUFControl ctrl in card.Controls) { if (ctrl.ID.Equals(control, StringComparison.OrdinalIgnoreCase)) { return ctrl; } } return null; } /// <summary> /// 生成控件回调按钮 /// </summary> /// <param name="card">按钮所在的Card</param> /// <param name="id">按钮ID</param> /// <param name="clickEvent">按钮回调事件</param> public static void LayoutCallBack(IUFCard card, string id, Action<object, EventArgs> clickEvent) { IUFButton callback = new UFWebButtonAdapter { ID = id, Visible = false, Text = "" }; card.Controls.Add(callback); Layout(card, callback, 0, 0); callback.Click += new EventHandler(clickEvent); } /// <summary> /// 查找回调控件按钮 /// </summary> /// <param name="card">按钮所在的Card</param> /// <param name="id">按钮ID</param> /// <returns></returns> public static IUFButton GetCallBackBtn(IUFCard card, string id) { var ctrls = card.Controls as UFControlCollection; // 从后往前找,因为Controls.Add会添加到最后面 for (int i = ctrls.Count - 1; i >= 0; i--) { if (ctrls[i].ID == id) return ctrls[i] as IUFButton; } return null; } }打开弹窗private void BtnXXX_Click_Extend(object sender, EventArgs e) { // 直接打开弹窗 this.ShowModalDialog("ac3322bd-b74e-409a-a687-a0d5697dd214", "窗体标题", "610", "130", null, null, true); // 弹窗窗体并在关闭弹窗时进入回调 IUFButton btnCall = CommonVoid.GetCallBackBtn(Card0, "BtnCallBack"); this.ShowAtlasModalDialog(btnCall, "ac3322bd-b74e-409a-a687-a0d5697dd214", "窗体标题", "472", "160", "", null, true, false, false); } public void AfterCreateChildControls() { // 创建回调弹窗 CommonVoid.LayoutCallBack(Card0, "BtnCallBack", BtnCallBack); } // 弹窗回调函数 private void PullOrderWindowCallBack(object sender, EventArgs e) { // 处理弹窗返回的数据 if (this.CurrentSessionState["XXX"] != null && base.CurrentSessionState["XXX"] is XXXXXX) { XXXXXX res = (XXXXXX)base.CurrentSessionState["XXX"]; // 处理res的代码...... this.CurrentSessionState["XXX"] = null; } // 清除一些关闭弹窗就要清空的CurrentSessionState,右上角关闭按钮也会触发回调 this.CurrentSessionState["XXXData1"] = null; this.CurrentSessionState["XXXData2"] = null; }初始化列表的行号 private void AfterCreateChildControls() { // 设置默认行号 GetProfileValueProxy bpObj = new GetProfileValueProxy(); bpObj.ProfileCode = "SysLineNo"; PVDTOData pVDTOData = bpObj.Do(); //行GRID IAutoRowNo rowNo = this.DataGrid6.Columns["DocLineNo"] as IAutoRowNo; if (rowNo != null) { rowNo.Sequence = true; rowNo.SequenceStep = Convert.ToInt32(pVDTOData.ProfileValue); rowNo.SequenceStart = Convert.ToInt32(pVDTOData.ProfileValue); } }个性化提示private void AfterCreateChildControls() { PDFormMessage.ShowDelConfirmDialog(this.Page, PDResource.DeleteConfirmInfo, Title, this.BtnDelete); //PDFormMessage.ShowConfirmDialog(this.Page, "是否审核!", "审核提示", this.BtnApprove); PDFormMessage.ShowConfirmDialog(this.Page, "是否弃审!", "弃审提示", this.BtnUndoApprove); }注册扩展字段private void AfterCreateChildControls() { //扩展字段 --单头实体扩展字段 FlexFieldHelper.SetDescFlexField(this.FlexFieldPicker0, this.Model.MainView); //扩展字段 --单行实体扩展字段 FlexFieldHelper.SetDescFlexField(this.DataGrid6, this.DataGrid6.Columns.Count - 1); }CallBack事件注册参考:【028】CallBack事件注册PostBack事件注册参考:【029】PostBack事件注册
2025年04月08日
10 阅读
0 评论
0 点赞
2025-04-08
【041】自动在前端提交审核U9单据
操作之前先在查询方案中筛选“开立”状态下的单据(注意,不是查找界面的栏目筛选),这样能节省时间/ 自动提交 // AutoSubmit() 从当前开始,点击完提交之后,500毫秒后进入下一页 // AutoSubmit(0) 从当前开始,点击完提交之后,500毫秒后进入上一页 // AutoSubmit(1, 1000) 从当前开始,点击完提交之后,1000毫秒后进入下一页 // AutoSubmit(0, 1000) 从当前开始,点击完提交之后,1000毫秒后进入上一页 function AutoSubmit(isNextPage, interval){ if(!interval) interval = 500; // 进入下一页的间隔,默认500毫秒(1000毫秒=1秒) if(isNextPage === undefined) isNextPage = true; var tid = setInterval(() => { var BtnSubmit = document.querySelector('#u_M_p0_BtnSubmit'); // 提交按钮 var BtnNextPage = isNextPage?document.querySelector('#u_M_p0_BtnNextPage'):document.querySelector('#u_M_p0_Bt nPrevPage'); // 下一页或者上一页 if(!BtnSubmit.disabled){ // 如果提交按钮是可点击状态(亮着的) BtnSubmit.click(); // 自动点击提交 setTimeout(() => { BtnNextPage.click(); }, interval); // 下一页 } else { BtnNextPage.click(); // 提交是灰的不能点,直接进入下一页 } }, interval); // 返回的tid,在需要修改此js程序时候,用来window.clearInterval(tid)停止程序用的 return tid; }// 自动保存 // AutoSave() 从当前开始,点击完保存之后,500毫秒后进入下一页 // AutoSave(0) 从当前开始,点击完保存之后,500毫秒后进入上一页 // AutoSave(1, 1000) 从当前开始,点击完保存之后,1000毫秒后进入下一页 // AutoSave(0, 1000) 从当前开始,点击完保存之后,1000毫秒后进入上一页 function AutoSave(isNextPage, interval){ if(!interval) interval = 500; // 进入下一页的间隔,默认500毫秒(1000毫秒=1秒) if(isNextPage === undefined) isNextPage = true; var tid = setInterval(() => { var BtnSave = document.querySelector('#u_M_p0_BtnSave'); // 保存按钮 var BtnNextPage = isNextPage? document.querySelector('#u_M_p0_BtnNextPage'):document.querySelector('#u_M_p0_Bt nPrevPage'); // 下一页或者上一页 if(!BtnSave.disabled){ // 如果保存按钮是可点击状态(亮着的) BtnSave.click(); // 自动点击保存 setTimeout(() => { BtnNextPage.click(); }, interval); // 下一页 } else { BtnNextPage.click(); // 保存是灰的不能点,直接进入下一页 } }, interval); // 返回的tid,在需要修改此js程序时候,用来window.clearInterval(tid)停止程序用的 return tid; }操作之前先在查询方案中筛选“核准中”状态下的单据(注意,不是查找界面的栏目筛选),这 样能节省时间// 自动审核 // AutoApprove() 从当前开始,点击完审核之后,500毫秒后进入下一页 // AutoApprove(0) 从当前开始,点击完审核之后,500毫秒后进入上一页 // AutoApprove(1, 1000) 从当前开始,点击完审核之后,1000毫秒后进入下一页 // AutoApprove(0, 1000) 从当前开始,点击完审核之后,1000毫秒后进入上一页 function AutoApprove(isNextPage, interval){ if(!interval) interval = 500; // 进入下一页的间隔,默认500毫秒(1000毫秒=1秒) if(isNextPage === undefined) isNextPage = true; var tid = setInterval(() => { var BtnApprove = document.querySelector('#u_M_p0_BtnApprove'); // 审核按 钮 var BtnNextPage = isNextPage? document.querySelector('#u_M_p0_BtnNextPage'):document.querySelector('#u_M_p0_Bt nPrevPage'); // 下一页或者上一页 if(!BtnApprove.disabled){ // 否则如果审核按钮是可点击状态(亮着的) BtnApprove.click(); // 自动点击审核 setTimeout(() => { BtnNextPage.click(); }, interval); // 500毫秒后进 入下一页 } else { BtnNextPage.click(); // 审核是灰的不能点,直接进入下一页 } }, interval); // 返回的tid,在需要修改此js程序时候,用来window.clearInterval(tid)停止程序用的 return tid; }自动在前端提交审核U9单据演示.mp4您的浏览器不支持 HTML5 视频,请下载Chrome或者Edge浏览器。
2025年04月08日
8 阅读
0 评论
0 点赞
2025-04-08
【040】生产订单BE插件错误信息处理
直接写throw new Exception("错误信息"),在UI界面显示是会显示堆栈信息的需要使用throw new MetadataAccessException("错误信息")才行
2025年04月08日
12 阅读
0 评论
0 点赞
1
2
3
...
6