JRT高效率开发
得益于前期的基础投入,借助代码生成的加持,本来计划用一周实现质控物维护界面,实际用来四小时左右完成质控物维护主体,效率大大超过预期。
JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式,觉得Spring打包模式开发效率太低、维护不现实、做不到分钟级别的需求响应。从开发环境、部署、脚本化、码表、代码生成、打印导出都用java实现等都是优秀考虑的效率。
质控物是下面这个界面,涉及增删改数据9个表,查树三个表,工作量自己估计,别看表多,增删改查的功能点多,基于JRT、实际写的代码不多,都是用生成代码加级联查询组装的。
代码结构,没多余概念,只有界面和后台
主体后台-可以看后台了解JRT推荐的业务范式
import JRT.Core.CustomAttributes.Trans;
import JRT.Core.Dto.OutValue;
import JRT.Core.Util.ReflectUtil;
import JRTBLLBase.BaseHttpHandler;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;/**
*由代码生成器生成的后台代码
*/
public class ashBTQCMaterial extends BaseHttpHandler {/*** 得到仪器树* @return*/public String GetMachineTree() throws Exception{List<MachineTreeDto> retList=new ArrayList<>();//得到用户可以访问的工作组List<SYSUserRole> roleList=EntityManager().FindByColVal(SYSUserRole.class,"UserDR",UserLogin().UserID);if(roleList!=null&&roleList.size()>0){HashMap hasOutWG=new HashMap();for(SYSUserRole role:roleList){//每个工作组只输出一次if(hasOutWG.containsKey(role.WorkGroupDR)){continue;}hasOutWG.put(role.WorkGroupDR,true);//工作组树节点MachineTreeDto wgTree=new MachineTreeDto();wgTree.RowID=role.WorkGroupDR;wgTree.id="WG-"+role.WorkGroupDR;BTWorkGroup wgDto=EntityManager().DolerGet(BTWorkGroup.class,role.WorkGroupDR);wgTree.text=wgDto.CName;wgTree.children=new ArrayList<>();wgTree.Type="WG";retList.add(wgTree);//查询所有工作小组List<BTWorkGroupMachine> wgmList=EntityManager().FindByColVal(BTWorkGroupMachine.class,"WorkGroupDR",role.WorkGroupDR);if(wgmList!=null&&wgmList.size()>0){for(BTWorkGroupMachine wgm:wgmList){//工作小组树节点MachineTreeDto wgmTree=new MachineTreeDto();wgmTree.RowID=wgm.RowID;wgmTree.id="WGM-"+wgm.RowID;wgmTree.text=wgm.CName;wgmTree.children=new ArrayList<>();wgmTree.Type="WGM";wgTree.children.add(wgmTree);//查询工作小组下的所有仪器List<BTMIMachineParameter> machList=EntityManager().FindByColVal(BTMIMachineParameter.class,"WorkGroupMachineDR",wgm.RowID);if(machList!=null&&machList.size()>0){for(BTMIMachineParameter mi:machList){//仪器树节点MachineTreeDto miTree=new MachineTreeDto();miTree.RowID=mi.RowID;miTree.id="MI-"+mi.RowID;miTree.text=mi.CName;miTree.Type="MI";wgmTree.children.add(miTree);}}}}}}//删除没有仪器的节点DealNoMachineTree(retList);return Helper.Object2Json(retList);}/*** 保存数据,前台按表的属性名提交* @return 字符串*/@Transpublic String SaveBTQCMaterial() throws Exception{BTQCMaterial dto=new BTQCMaterial();//主键 dto.RowID=Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), dto.RowID);//代码 dto.Code=Helper.ValidParam(JRTContext.GetRequest(Request, "Code"), dto.Code);//名称 dto.CName=Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), dto.CName);//仪器 dto.MachineDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MachineDR"), dto.MachineDR);//浓度数 dto.Levels=Helper.ValidParam(JRTContext.GetRequest(Request, "Levels"), dto.Levels);//波长 dto.WaveLength=Helper.ValidParam(JRTContext.GetRequest(Request, "WaveLength"), dto.WaveLength);//是否自动入库 {1:true,0:false}dto.AutoSave=Helper.ValidParam(JRTContext.GetRequest(Request, "AutoSave"), dto.AutoSave);//说明 dto.Remark=Helper.ValidParam(JRTContext.GetRequest(Request, "Remark"), dto.Remark);//序号 dto.Sequence=Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), dto.Sequence);//激活 {1:true,0:false}dto.Active=Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), dto.Active);//是否覆盖数据 {1:true,0:false}dto.IsOverWriteData=Helper.ValidParam(JRTContext.GetRequest(Request, "IsOverWriteData"), dto.IsOverWriteData);//不允许日间质控 {1:true,0:false}dto.NotAllowDay=Helper.ValidParam(JRTContext.GetRequest(Request, "NotAllowDay"), dto.NotAllowDay);//日间质控没做不显示 {1:true,0:false}dto.NotShowNullDay=Helper.ValidParam(JRTContext.GetRequest(Request, "NotShowNullDay"), dto.NotShowNullDay);OutValue key=new OutValue();int ret=0;//更新if(dto.RowID>0){ret=EntityManager().Update(dto,null, ErrRet(), null, null, null);}//插入数据else{ret=EntityManager().Save(dto,key,ErrRet());if(ret==1) {for (int i = 0; i < dto.Levels; i++) {BTQCMaterialLevel levDto = new BTQCMaterialLevel();levDto.CName = "浓度" + (i + 1);levDto.Color = "";levDto.LevelNo = i + 1;levDto.MaterialDR = dto.RowID;EntityManager().Save(levDto,key,ErrRet());}}else{throw new Exception(Err.GetString());}}if(ret==1){return Helper.Success();}else{return Helper.Error();}}/*** 删除数据,多个RowID以上尖号分割* @return 字符串*/@Transpublic String DeleteBTQCMaterial() throws Exception{String RowIDS=Helper.ValidParam(JRTContext.GetRequest(Request, "RowIDS"), "");if(RowIDS.isEmpty()){return Helper.Error("请传入要删除数据的RowID,多个以^分割!");}//分割主键String [] arr=RowIDS.split("^");//out参数OutParam out=new OutParam();//循环删除数据for(int i=0;i<arr.length;i++){int id = Convert.ToInt32(arr[i]);//删除质控浓度EntityManager().RemoveByColVal(BTQCMaterialLevel.class, "MaterialDR", id);//删除质控标识EntityManager().RemoveByColVal(BTQCMachineQC.class, "MaterialDR", id);//删除质控规则EntityManager().RemoveByColVal(BTQCMaterialRules.class, "MaterialDR", id);int ret=EntityManager().RemoveById(BTQCMaterial.class,id,out);if(ret!=1){return Helper.Error(out);}}return Helper.Success();}/*** 查询选择树的仪器* @return 字符串*/public String QrySelectMachine() throws Exception {List<BTMIMachineParameter> retist = new ArrayList<>();//工作组String WorkGroupDR = Helper.ValidParam(JRTContext.GetRequest(Request, "WorkGroupDR"), "");//工作小组String WorkGroupMachineDR = Helper.ValidParam(JRTContext.GetRequest(Request, "WorkGroupMachineDR"), "");//仪器String MachineDR = Helper.ValidParam(JRTContext.GetRequest(Request, "MachineDR"), "");//选择工作组if(!WorkGroupDR.isEmpty()) {//查工作小组List<BTWorkGroupMachine> wgmList=EntityManager().FindByColVal(BTWorkGroupMachine.class,"WorkGroupDR",Integer.valueOf(WorkGroupDR));if(wgmList!=null&&wgmList.size()>0){for(BTWorkGroupMachine wgm:wgmList){//查仪器List<BTMIMachineParameter> miList=EntityManager().FindByColVal(BTMIMachineParameter.class,"WorkGroupMachineDR",wgm.RowID);retist.addAll(miList);}}}//选择工作小组else if(!WorkGroupMachineDR.isEmpty()) {//查仪器List<BTMIMachineParameter> miList=EntityManager().FindByColVal(BTMIMachineParameter.class,"WorkGroupMachineDR",Integer.valueOf(WorkGroupMachineDR));retist.addAll(miList);}//选择仪器else if(!MachineDR.isEmpty()) {BTMIMachineParameter mi=EntityManager().DolerGet(BTMIMachineParameter.class,Integer.valueOf(MachineDR));retist.add(mi);}return Helper.Object2Json(retist);}/*** 查询数据,前台按表的属性名提交* @return 字符串*/public String QryBTQCMaterial() throws Exception{List<BTQCMaterialDto> retlist=new ArrayList<>();//工作组String WorkGroupDR=Helper.ValidParam(JRTContext.GetRequest(Request, "WorkGroupDR"), "");//工作小组String WorkGroupMachineDR=Helper.ValidParam(JRTContext.GetRequest(Request, "WorkGroupMachineDR"), "");//仪器String MachineDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MachineDR"), "");//存仪器List<BTMIMachineParameter> machList=new ArrayList<>();//选择工作组if(!WorkGroupDR.isEmpty()) {//查工作小组List<BTWorkGroupMachine> wgmList=EntityManager().FindByColVal(BTWorkGroupMachine.class,"WorkGroupDR",Integer.valueOf(WorkGroupDR));if(wgmList!=null&&wgmList.size()>0){for(BTWorkGroupMachine wgm:wgmList){//查仪器List<BTMIMachineParameter> miList=EntityManager().FindByColVal(BTMIMachineParameter.class,"WorkGroupMachineDR",wgm.RowID);machList.addAll(miList);}}}//选择工作小组else if(!WorkGroupMachineDR.isEmpty()) {//查仪器List<BTMIMachineParameter> miList=EntityManager().FindByColVal(BTMIMachineParameter.class,"WorkGroupMachineDR",Integer.valueOf(WorkGroupMachineDR));machList.addAll(miList);}//选择仪器else if(!MachineDR.isEmpty()) {BTMIMachineParameter mi=EntityManager().DolerGet(BTMIMachineParameter.class,Integer.valueOf(MachineDR));machList.add(mi);}if(machList.size()>0){for(BTMIMachineParameter mi:machList){List<BTQCMaterialDto> miMats=EntityManager().FindByColVal(BTQCMaterialDto.class,"MachineDR",mi.RowID);if(miMats!=null&&miMats.size()>0) {for(BTQCMaterialDto one:miMats){one.WorkGroupMachineDR=mi.WorkGroupMachineDR;BTWorkGroupMachine wgm=EntityManager().DolerGet(BTWorkGroupMachine.class,mi.WorkGroupMachineDR);one.WorkGroupMachineName=wgm.CName;one.WorkGroupDR=wgm.WorkGroupDR;BTWorkGroup wg=EntityManager().DolerGet(BTWorkGroup.class,wgm.WorkGroupDR);one.WorkGroupName=wg.CName;one.MachineName=mi.CName;}retlist.addAll(miMats);}}}return Helper.Object2Json(retlist);}/*** 保存数据,前台按表的属性名提交* @return 字符串*/public String SaveBTQCMaterialTestCode() throws Exception{BTQCMaterialTestCode dto=new BTQCMaterialTestCode();//主键dto.RowID=Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), dto.RowID);//质控物dto.MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), dto.MaterialDR);//项目dto.TestCodeDR=Helper.ValidParam(JRTContext.GetRequest(Request, "TestCodeDR"), dto.TestCodeDR);//浓度dto.LevelNo=Helper.ValidParam(JRTContext.GetRequest(Request, "LevelNo"), dto.LevelNo);//开始日期dto.StartDate=Helper.ValidParam(JRTContext.GetRequest(Request, "StartDate"), dto.StartDate);//靶子dto.Mean=Helper.ValidParam(JRTContext.GetRequest(Request, "Mean"), dto.Mean);//标准差dto.SD=Helper.ValidParam(JRTContext.GetRequest(Request, "SD"), dto.SD);//设置CVdto.SetCV=Helper.ValidParam(JRTContext.GetRequest(Request, "SetCV"), dto.SetCV);//目标CVdto.TargetCV=Helper.ValidParam(JRTContext.GetRequest(Request, "TargetCV"), dto.TargetCV);//质控品批号dto.LotNo=Helper.ValidParam(JRTContext.GetRequest(Request, "LotNo"), dto.LotNo);//质控物厂家dto.MatManufacturer=Helper.ValidParam(JRTContext.GetRequest(Request, "MatManufacturer"), dto.MatManufacturer);//厂家均值dto.ManufacturerMean=Helper.ValidParam(JRTContext.GetRequest(Request, "ManufacturerMean"), dto.ManufacturerMean);//厂家标准差dto.ManufacturerSD=Helper.ValidParam(JRTContext.GetRequest(Request, "ManufacturerSD"), dto.ManufacturerSD);//试剂批号dto.RgLot=Helper.ValidParam(JRTContext.GetRequest(Request, "RgLot"), dto.RgLot);//试剂厂家dto.RgManufacturer=Helper.ValidParam(JRTContext.GetRequest(Request, "RgManufacturer"), dto.RgManufacturer);//测试方法dto.TestMethod=Helper.ValidParam(JRTContext.GetRequest(Request, "TestMethod"), dto.TestMethod);//计算类型dto.CalcType=Helper.ValidParam(JRTContext.GetRequest(Request, "CalcType"), dto.CalcType);//精度dto.Precision=Helper.ValidParam(JRTContext.GetRequest(Request, "Precision"), dto.Precision);//稀释倍数dto.Dilutions=Helper.ValidParam(JRTContext.GetRequest(Request, "Dilutions"), dto.Dilutions);//说明dto.Remark=Helper.ValidParam(JRTContext.GetRequest(Request, "Remark"), dto.Remark);//浓度单位dto.LevelUnit=Helper.ValidParam(JRTContext.GetRequest(Request, "LevelUnit"), dto.LevelUnit);//CV来源dto.CVSource=Helper.ValidParam(JRTContext.GetRequest(Request, "CVSource"), dto.CVSource);//生产日期dto.ProductDate=Helper.ValidParam(JRTContext.GetRequest(Request, "ProductDate"), dto.ProductDate);//有效日期dto.ExpiryDate=Helper.ValidParam(JRTContext.GetRequest(Request, "ExpiryDate"), dto.ExpiryDate);//关闭日期dto.ClosingDate=Helper.ValidParam(JRTContext.GetRequest(Request, "ClosingDate"), dto.ClosingDate);//校正液批次dto.AmendLiquidLot=Helper.ValidParam(JRTContext.GetRequest(Request, "AmendLiquidLot"), dto.AmendLiquidLot);//主波长dto.WaveLengthMian=Helper.ValidParam(JRTContext.GetRequest(Request, "WaveLengthMian"), dto.WaveLengthMian);//波长dto.WaveLength=Helper.ValidParam(JRTContext.GetRequest(Request, "WaveLength"), dto.WaveLength);//生效日期dto.RgEffectiveDate=Helper.ValidParam(JRTContext.GetRequest(Request, "RgEffectiveDate"), dto.RgEffectiveDate);//校准液有效期dto.AmendLiquidDate=Helper.ValidParam(JRTContext.GetRequest(Request, "AmendLiquidDate"), dto.AmendLiquidDate);//校准液dto.AmendLiquid=Helper.ValidParam(JRTContext.GetRequest(Request, "AmendLiquid"), dto.AmendLiquid);//偏离图SDdto.DeviationRatioSD=Helper.ValidParam(JRTContext.GetRequest(Request, "DeviationRatioSD"), dto.DeviationRatioSD);//规则说明dto.RuleRemark=Helper.ValidParam(JRTContext.GetRequest(Request, "RuleRemark"), dto.RuleRemark);//序号dto.Sequence=Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), dto.Sequence);//激活 {1:true,0:false}dto.Active=Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), dto.Active);//计算靶值dto.FloatMean=Helper.ValidParam(JRTContext.GetRequest(Request, "FloatMean"), dto.FloatMean);//计算标准差dto.FloatSD=Helper.ValidParam(JRTContext.GetRequest(Request, "FloatSD"), dto.FloatSD);//累计总数dto.AccSum=Helper.ValidParam(JRTContext.GetRequest(Request, "AccSum"), dto.AccSum);//累计均值dto.AccMean=Helper.ValidParam(JRTContext.GetRequest(Request, "AccMean"), dto.AccMean);//累计标准差dto.AccSD=Helper.ValidParam(JRTContext.GetRequest(Request, "AccSD"), dto.AccSD);//在控个数dto.InControlNum=Helper.ValidParam(JRTContext.GetRequest(Request, "InControlNum"), dto.InControlNum);//在控均值dto.InControlMean=Helper.ValidParam(JRTContext.GetRequest(Request, "InControlMean"), dto.InControlMean);//在控标准差dto.InControlSD=Helper.ValidParam(JRTContext.GetRequest(Request, "InControlSD"), dto.InControlSD);OutParam out=new OutParam();int ret=0;//更新if(dto.RowID>0){ret=EntityManager().Update(dto,null, out, null, null, null);}//插入数据else{ret=EntityManager().Save(dto,out);}if(ret==1){return Helper.Success();}else{return Helper.Error(out);}}/*** 删除数据,多个RowID以上尖号分割* @return 字符串*/public String DeleteBTQCMaterialTestCode() throws Exception{String RowIDS=Helper.ValidParam(JRTContext.GetRequest(Request, "RowIDS"), "");if(RowIDS.isEmpty()){return Helper.Error("请传入要删除数据的RowID,多个以^分割!");}//分割主键String [] arr=RowIDS.split("^");//out参数OutParam out=new OutParam();//循环删除数据for(int i=0;i<arr.length;i++){int ret=EntityManager().RemoveById(BTQCMaterialTestCode.class,Convert.ToInt32(arr[i]),out);if(ret!=1){return Helper.Error(out);}}return Helper.Success();}/*** 查询数据,前台按表的属性名提交* @return 字符串*/public String QryBTQCMaterialTestCode() throws Exception{//分页int pageSize = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "rows"), -1);int pageIndex = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "page"), -1);//质控物int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);//按项目和浓度筛选String TestCodeDR=Helper.ValidParam(JRTContext.GetRequest(Request, "TestCodeDR"), "");String LevelNo=Helper.ValidParam(JRTContext.GetRequest(Request, "LevelNo"), "");//筛选String Filter=Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");//质控浓度数据List<BTQCMaterialLevel> levList=EntityManager().FindByColVal(BTQCMaterialLevel.class,"MaterialDR",MaterialDR);HashParam hs=new HashParam();hs.Add("MaterialDR",MaterialDR);if(!TestCodeDR.isEmpty()){hs.Add("TestCodeDR",Convert.ToInt32(TestCodeDR));}if(!LevelNo.isEmpty()){hs.Add("LevelNo",Convert.ToInt32(LevelNo));}OutValue totalNum=new OutValue();//分页查询List<BTQCMaterialTestCodeDto> dataList=EntityManager().FindAll(BTQCMaterialTestCodeDto.class,hs,"StartDate desc",pageSize,pageIndex,"",null,null,totalNum);List<BTQCMaterialTestCodeDto> retList=new ArrayList<>();if(dataList!=null&&dataList.size()>0){for(BTQCMaterialTestCodeDto one:dataList){one.LevelNoName="";for(BTQCMaterialLevel lev:levList){if(lev.LevelNo==one.LevelNo){one.LevelNoName=lev.CName;}}//项目数据BTTestCode tsDto=EntityManager().DolerGet(BTTestCode.class,one.TestCodeDR);one.TestCodeCode=tsDto.Code;one.TestCodeDR=tsDto.RowID;one.TestCodeSynonym=tsDto.Synonym;one.TestCodeName=tsDto.CName;boolean isPerData=false;if(!Filter.isEmpty()&&one.LevelNoName.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.TestCodeName.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.TestCodeCode.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.LotNo.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.RgLot.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.Remark.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.MatManufacturer.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.RgManufacturer.equals(Filter)){isPerData=true;}if(Filter.isEmpty()||isPerData==true){retList.add(one);}}}return Helper.MakeTotalJson(retList,totalNum);}/*** 查询能够开通的项目或者已经开通的项目* @return*/public String QueryOpenTestCode() throws Exception{//查是否有开通项目boolean HasOpen=Helper.ValidParam(JRTContext.GetRequest(Request, "HasOpen"), false);//质控物主键int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);//得到质控物的数据BTQCMaterial matDto=EntityManager().DolerGet(BTQCMaterial.class,MaterialDR);//仪器数据BTMIMachineParameter machDto=EntityManager().DolerGet(BTMIMachineParameter.class,matDto.MachineDR);//查询仪器项目List<BTMIMachineTestCode> machTsList=EntityManager().FindByColVal(BTMIMachineTestCode.class,"MachineParameterDR",matDto.MachineDR);//质控浓度数据List<BTQCMaterialLevel> levList=EntityManager().FindByColVal(BTQCMaterialLevel.class,"MaterialDR",MaterialDR);//返回列表List<BTMIMachineTestCodeDto> retList=new ArrayList<>();if(machTsList!=null&&machTsList.size()>0){for(int i=0;i<machTsList.size();i++){//没激活的不要if(machTsList.get(i).Active!=null&&machTsList.get(i).Active==false){continue;}for(int j=1;j<=matDto.Levels;j++){HashParam hs=new HashParam();hs.Add("MaterialDR",matDto.RowID);hs.Add("TestCodeDR",machTsList.get(i).TestCodeDR);hs.Add("LevelNo",j);//按条件检查是否有数据boolean hasOpen=EntityManager().CheckHasData(BTQCMaterialTestCode.class,hs,null,null);//根据开通决定输出if(hasOpen==HasOpen){BTMIMachineTestCodeDto one=new BTMIMachineTestCodeDto();one.MaterialDR=matDto.RowID;one.MachineDR=machDto.RowID;one.LevelNo=j;one.LevelNoName="";for(BTQCMaterialLevel lev:levList){if(lev.LevelNo==j){one.LevelNoName=lev.CName;}}//项目数据BTTestCode tsDto=EntityManager().DolerGet(BTTestCode.class,machTsList.get(i).TestCodeDR);one.TestCodeCode=tsDto.Code;one.TestCodeDR=tsDto.RowID;one.TestCodeSynonym=tsDto.Synonym;one.TestCodeName=tsDto.CName;retList.add(one);}}}}return Helper.Object2Json(retList);}/*** 开通质控项目* @return*/@Transpublic String OpenBTQCMaterialTestCode() throws Exception{int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);int MaterialLotDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialLotDR"), 0);String OpenTsLev=Helper.ValidParam(JRTContext.GetRequest(Request, "OpenTsLev"), "");String [] arr=OpenTsLev.split("\\^");//公共信息BTQCMaterialLot lotDto=EntityManager().DolerGet(BTQCMaterialLot.class,MaterialLotDR);OutValue key=new OutValue();for(String one:arr){String [] tsLev=one.split("-");int TestCodeDR=Convert.ToInt32(tsLev[0]);int LevelNo=Convert.ToInt32(tsLev[1]);BTQCMaterialTestCode dto=new BTQCMaterialTestCode();//拷贝相同的属性值ReflectUtil.CopyProperties(lotDto,dto);dto.MaterialDR=MaterialDR;dto.TestCodeDR=TestCodeDR;dto.LevelNo=LevelNo;int ret=EntityManager().Save(dto,key,ErrRet());if(ret!=1){throw new Exception(Err.GetString());}}return Helper.Success();}/*** 查询数据,前台按表的属性名提交* @return 字符串*/public String QryQCResMaterialTestCode() throws Exception{//分页int pageSize = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "rows"), -1);int pageIndex = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "page"), -1);//质控物int MaterialDR=Helper.ValidParam(JRTContext.GetRequest(Request, "MaterialDR"), 0);//按项目和浓度筛选String TestCodeDR=Helper.ValidParam(JRTContext.GetRequest(Request, "TestCodeDR"), "");String LevelNo=Helper.ValidParam(JRTContext.GetRequest(Request, "LevelNo"), "");//筛选String Filter=Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");//质控浓度数据List<BTQCMaterialLevel> levList=EntityManager().FindByColVal(BTQCMaterialLevel.class,"MaterialDR",MaterialDR);HashParam hs=new HashParam();hs.Add("MaterialDR",MaterialDR);if(!TestCodeDR.isEmpty()){hs.Add("TestCodeDR",Convert.ToInt32(TestCodeDR));}if(!LevelNo.isEmpty()){hs.Add("LevelNo",Convert.ToInt32(LevelNo));}OutValue totalNum=new OutValue();//分页查询List<QCResMaterialTestCodeDto> dataList=EntityManager().FindAll(QCResMaterialTestCodeDto.class,hs,"TestDate desc",pageSize,pageIndex,"",null,null,totalNum);List<QCResMaterialTestCodeDto> retList=new ArrayList<>();if(dataList!=null&&dataList.size()>0){for(QCResMaterialTestCodeDto one:dataList){one.LevelNoName="";for(BTQCMaterialLevel lev:levList){if(lev.LevelNo==one.LevelNo){one.LevelNoName=lev.CName;}}//项目数据BTTestCode tsDto=EntityManager().DolerGet(BTTestCode.class,one.TestCodeDR);one.TestCodeCode=tsDto.Code;one.TestCodeDR=tsDto.RowID;one.TestCodeSynonym=tsDto.Synonym;one.TestCodeName=tsDto.CName;boolean isPerData=false;if(!Filter.isEmpty()&&one.LevelNoName.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.TestCodeName.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.TestCodeCode.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.LotNo.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.RgLot.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.Remark.contains(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.MatManufacturer.equals(Filter)){isPerData=true;}if(!Filter.isEmpty()&&one.RgManufacturer.equals(Filter)){isPerData=true;}if(Filter.isEmpty()||isPerData==true){retList.add(one);}}}return Helper.MakeTotalJson(retList,totalNum);}/*** 去除没有仪器的树节点* @param retList 树节点集合*/private void DealNoMachineTree(List<MachineTreeDto> retList) throws Exception{if(retList!=null&&retList.size()>0){for(int i=0;i<retList.size();i++){//没有工作小组的工作组删掉if(retList.get(i).children.size()==0){retList.remove(i);i--;}else{//检查每个工作小组for(int j=0;j<retList.get(i).children.size();j++){//工作小组下没有仪器if(retList.get(i).children.get(j).children.size()==0){retList.get(i).children.remove(j);j--;}}//没有小组就把工作组节点也删了if(retList.get(i).children.size()==0){retList.remove(i);i--;}}}}}/*** 质控业务数据的批次项目信息*/public static class QCResMaterialTestCodeDto extends QCResMaterialTestCode{/*** 浓度名称*/public String LevelNoName;/*** 项目代码*/public String TestCodeCode;/*** 项目名称*/public String TestCodeName;/*** 项目缩写*/public String TestCodeSynonym;}/*** 返回仪器项目的数据*/public static class BTMIMachineTestCodeDto{/*** 质控物主键*/public int MaterialDR;/*** 仪器主键*/public int MachineDR;/*** 项目主键*/public int TestCodeDR;/*** 浓度*/public int LevelNo;/*** 浓度名称*/public String LevelNoName;/*** 项目代码*/public String TestCodeCode;/*** 项目名称*/public String TestCodeName;/*** 项目缩写*/public String TestCodeSynonym;}/*** 质控仪器树实体*/public static class MachineTreeDto {/*** 数据唯一键*/public int RowID;/*** 树id*/public String id;/*** 树文本*/public String text;/*** 是否选择*/public String checked;/*** 子节点*/public List<MachineTreeDto> children;/*** 节点类型*/public String Type;}/*** 质控物实体*/public static class BTQCMaterialDto extends BTQCMaterial{/*** 工作组主键*/public int WorkGroupDR;/*** 工作组名称*/public String WorkGroupName;/*** 工作小组主键*/public int WorkGroupMachineDR;/*** 工作小组名称*/public String WorkGroupMachineName;/*** 仪器名称*/public String MachineName;}/*** 质控项目的返回实体*/public static class BTQCMaterialTestCodeDto extends BTQCMaterialTestCode{/*** 浓度名称*/public String LevelNoName;/*** 项目代码*/public String TestCodeCode;/*** 项目名称*/public String TestCodeName;/*** 项目缩写*/public String TestCodeSynonym;}}
主体界面代码太多,博客放不下,放个质控规则维护的界面前端,前后台交互通过ajax
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>质控规则维护</title><link rel="shortcut icon" href="../../resource/common/images/favicon.ico" /><script src="../../resource/common/js/JRTBSBase.js" type="text/javascript"></script><link href="../../resource/plug/spectrum/css/spectrum.css" rel="stylesheet" type="text/css" /><script src="../../resource/plug/spectrum/js/spectrum.js" type="text/javascript"></script><script language="javascript" type="text/javascript">SYSPageCommonInfo.Init();var BasePath = '';var ResourcePath = '';var WebServicAddress = SYSPageCommonInfo.Data.WebServicAddress;var UserID = SYSPageCommonInfo.Data.Sesssion.UserID;var GroupID = SYSPageCommonInfo.Data.Sesssion.GroupID;var SessionStr = SYSPageCommonInfo.Data.SessionStr;</script><script type="text/javascript">//全局变量var me = {actionUrl: '../ashx/ashBTQCRules.ashx'};//jquery入口$(function () {//规则颜色$("#txtBTQCRulesColor").spectrum({showInput: true,showPalette: true,color: "",cancelText:"取消",chooseText:"选择",clearText:"清空选择",palette: [["#333333", "#449be2", "#50b90c", "#39c6c8", "afd17e", "#A85B93"],["#FFD572", "#ff32a1", "#d952d1", "#9152d9", "#494dee", "#327eb2"],["#f3723b", "#21be97", "#2ab66a", "#aade5f", "#ffb746", "#ff793e"],["#ff5252", "#f16e57", "#fd930c", "#d07605", "#955606", "#8be451"],["#ec90da", "#338001", "#fda632", "#0670c6", "#135890", "#afd17e"],["#c00eb5", "#891082", "#7dba56", "#f4d44f", "#6abfef", "c0c0c0"]]});//质控状态$("#txtBTQCRulesStatus").combogrid({panelWidth: 350,idField: 'RowID',width: 205,textField: 'CName',data:[{RowID:"W",CName:"警告"},{RowID:"R",CName:"失控"}],columns: [[{ field: 'RowID', title: '主键', width: 60 },{ field: 'CName', title: '名称', width: 260 }]]});//新增数据点击$("#btnAddBTQCRules").click(function () {$("#txtBTQCRulesRowID").val(""); $('#winEditBTQCRules').window({title: TranslateDataMTHD('Add Data', '新增数据', ''),modal: true});});//修改数据点击$("#btnUpdateBTQCRules").click(function () {UpdateBTQCRules();});//修改数据function UpdateBTQCRules(row){var selectRow = $('#dgBTQCRules').datagrid("getSelected");if(row!=null){selectRow=row;}if (selectRow == null) {$.messager.alert(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Please select the data to modify', '请选择要修改的数据!', ''), 'info');return;}$("#formBTQCRules").form('load', selectRow);$("#txtBTQCRulesColor").spectrum("set",selectRow.Color);$('#winEditBTQCRules').window({title: TranslateDataMTHD('Update Data', '修改数据', ''),modal: true});}//删除数据点击$("#btnDeleteBTQCRules").click(function () {var checkRow = $('#dgBTQCRules').datagrid("getChecked");var selectRow = $('#dgBTQCRules').datagrid("getSelected");if ((checkRow == null || checkRow.length == 0)&&selectRow==null) {$.messager.alert(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Please select the data to delete', '请勾选要删除的数据!', ''), 'info');return;}if ((checkRow == null || checkRow.length == 0)) {checkRow=[selectRow];}var RowIDS = "";for (var i = 0; i < checkRow.length; i++) {if (i == 0) {RowIDS = checkRow[i].RowID;}else {RowIDS += "^" + checkRow[i].RowID;}}$.messager.confirm(TranslateDataMTHD('Info', '提示', ''), TranslateDataMTHD('Do you want to delete the selected data', '是否要删除选择的数据?', '') , function (r) {if (r) {//开启等待$.messager.progress({ text: TranslateDataMTHD("Deleting data","正在删除数据", ""), interval: 500 });setTimeout(function () {$.messager.progress('close');}, 8000);//往后台提交数据$.ajax({type: "post",dataType: "json",cache: false, //async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asirurl: me.actionUrl + '?Method=DeleteBTQCRules',data: { RowIDS: RowIDS },success: function (data, status) {$.messager.progress('close');if (!FilterBackData(data)) {return;}if (!data.IsOk) {$.messager.alert(TranslateDataMTHD("Error message", "错误提示", ""), TranslateDataMTHD("failed to dalete data, error message:", "删除失败,错误信息:", "") + data.Message);}else {QryBTQCRules();$.messager.show({title: TranslateDataMTHD("Info", "提示", ""),msg: TranslateDataMTHD("Successfully deleted!", "删除成功!", ""),timeout: 500,showType: 'slide'});}}});}});});//保存数据$("#btnSaveBTQCRules").click(function () {var saveData = jQuery.parseJSON($("#formBTQCRules").serializeObject());var Color = $("#txtBTQCRulesColor").spectrum('get').toHexString();saveData.Color=Color;//开启等待$.messager.progress({ text: TranslateDataMTHD("Saving data","正在保存数据", ""), interval: 500 });setTimeout(function () {$.messager.progress('close');}, 8000);//往后台提交数据$.ajax({type: "post",dataType: "json",cache: false, //async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asirurl: me.actionUrl + '?Method=SaveBTQCRules',data: saveData,success: function (data, status) {$.messager.progress('close');if (!FilterBackData(data)) {return;}if (!data.IsOk) {$.messager.alert(TranslateDataMTHD("Error message", "错误提示", ""), TranslateDataMTHD("failed to dalete data, error message:", "删除失败,错误信息:", "") + data.Message);}else {QryBTQCRules();$.messager.show({title: TranslateDataMTHD("Info", "提示", ""),msg: TranslateDataMTHD("Successfully saveed!", "保存成功!", ""),timeout: 500,showType: 'slide'});$('#winEditBTQCRules').window("close");}}});});//关闭窗口$("#btnCloseBTQCRules").click(function () {$('#winEditBTQCRules').window("close");});//构造查询事件$("#txtFilterBTQCRules").searchbox({searcher: function (value, name) {QryBTQCRules();},prompt: TranslateDataMTHD('Enter query', '回车查询', '')});//激活布尔渲染$('#txtBTQCRulesActive').combobox({valueField:'RowID',textField:'CName',width: 205,data: [{"RowID":false,"CName":TranslateDataMTHD('No', '否', '')},{"RowID":true,"CName":TranslateDataMTHD('Yes', '是', '')}]});//BTQCRules表格$('#dgBTQCRules').datagrid({remoteSort:false,singleSelect: true,toolbar: "#dgBTQCRulesToolBar",fit: true,onSelect: function (index, row) {//方便拷贝到子表查询用var selectBTQCRules=$('#dgBTQCRules').datagrid("getSelected");},onDblClickRow: function (index, row) {UpdateBTQCRules(row);},columns: [[{ field: 'ChkFlag', title: TranslateDataMTHD('Check', '选择', ''), width: 20, sortable: true, align: 'center', checkbox: true },{ field: 'RowID', title: TranslateDataMTHD('RowID', '主键', '') , width: 50, sortable: true },{ field: 'Code', title: TranslateDataMTHD('Code', '代码', '') , width: 60, sortable: true },{ field: 'CName', title: TranslateDataMTHD('CName', '名称', '') , width: 120, sortable: true },{ field: 'Status', title: TranslateDataMTHD('Status', '状态', '') , width: 80, sortable: true },{ field: 'Color', title: TranslateDataMTHD('Color', '颜色', '') , width: 80, sortable: true,formatter: function (value, rowData, rowIndex) {if (value == "") {var LevelNoIndex = rowData.LevelNo - 1;value = AllLineColor[LevelNoIndex];}return '<span style="color:' + value + ';font-weight:bold;">' + TranslateDataMTHD('Color', '颜色', "") + '</span>'}},{ field: 'Remark', title: TranslateDataMTHD('Remark', '说明', '') , width: 650, sortable: true },{ field: 'Sequence', title: TranslateDataMTHD('Sequence', '序号', '') , width: 60, sortable: true },{ field: 'Active', title: TranslateDataMTHD('Active', '激活', '') , width: 60, sortable: true,formatter: function (value, rowData, rowIndex) {return rowData.Active == true ? '<img src="../images/icon/active.png" alt="激活" title="激活"/>' : '<img src="../images/icon/cross.png" alt="未激活" title="未激活"/>';}}]]});//查询BTQCRulesfunction QryBTQCRules() {var Filter = $("#txtFilterBTQCRules").searchbox("getValue");//开启等待,默认注释,在单击事件调用的逻辑启用等待会冲掉双击事件,按需要开启//$.messager.progress({ text: TranslateDataMTHD("Querying data","正在查询数据", ""), interval: 500 });//setTimeout(function () {//$.messager.progress('close');//}, 8000);$.ajax({type: "post",dataType: "json",cache: false, //async: true, //为true时,异步,不等待后台返回值,为false时强制等待;-asirurl: me.actionUrl + '?Method=QryBTQCRules',data: { Filter: Filter },success: function (data, status) {//结束等待//$.messager.progress('close');if (!FilterBackData(data)) {return;}$('#dgBTQCRules').datagrid("loadData", data);}});};//执行查询数据QryBTQCRules();});</script>
</head>
<body><div class="easyui-layout" fit="true" style="border: none;"><div data-options="region:'center',title:''" style="border: none;"><div id="dgBTQCRulesToolBar" style="padding: 3px 0px 3px 10px;"><a id="btnAddBTQCRules" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-add'" plain="true" listranslate="html~Add">新增</a><a id="btnUpdateBTQCRules" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-write-order'" plain="true" listranslate="html~Mod">修改</a><a id="btnDeleteBTQCRules" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" plain="true" listranslate="html~Del">删除</a><input id="txtFilterBTQCRules" style="margin-left: 14px; width: 240px;"></input></div><table id="dgBTQCRules" title="" iconcls="icon-paper" listranslate="title~BTQCRules"></table></div><div id="winEditBTQCRules" style="padding: 10px 0px 0px 10px;width:550px;height:318px;display: none;"><form id="formBTQCRules" name="edit_form" method="post"><input type="hidden" id="txtBTQCRulesRowID" name="RowID" value="0" /><table><tr><td class="lisar" jrttranslate="html~Code">代码</td><td class="lisal"><input id="txtBTQCRulesCode" type="text" name="Code" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td><td class="lisar" jrttranslate="html~CName">名称</td><td class="lisal"><input id="txtBTQCRulesCName" type="text" name="CName" style="width:200px;" class="easyui-validatebox" maxlength="40"/></td></tr><tr><td class="lisar" jrttranslate="html~Status">状态</td><td class="lisal"><input id="txtBTQCRulesStatus" type="text" name="Status" style="width:200px;" class="easyui-validatebox" maxlength="1"/></td><td class="lisar" jrttranslate="html~Color">颜色</td><td class="lisal"><input id="txtBTQCRulesColor" type="text" name="Color" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td></tr><tr><td class="lisar" jrttranslate="html~Remark">说明</td><td class="lisal" colspan="3"><textarea id="txtBTQCRulesRemark" name="Remark" style="width:460px;height: 90px; resize: none;" rows="3" class="easyui-validatebox" maxlength="200" cols="40" ></textarea></td></tr><tr><td class="lisar" jrttranslate="html~Sequence">序号</td><td class="lisal"><input id="txtBTQCRulesSequence" type="text" name="Sequence" style="width:200px;" class="easyui-validatebox" maxlength="10"/></td><td class="lisar" jrttranslate="html~Active">激活</td><td class="lisal"><input id="txtBTQCRulesActive" type="text" name="Active" style="width:200px;" class="easyui-validatebox" maxlength="1"/></td></tr></table><div region="south" border="fale" style="text-align: center; padding: 5px 0 0;"><a id="btnSaveBTQCRules" href="#" class="easyui-linkbutton" plain="false" listranslate="html~Save">保存</a><span class="sp6"></span><a id="btnCloseBTQCRules" href="#" class="easyui-linkbutton" plain="false" listranslate="html~Cancel">取消</a></div></form></div></div>
</body>
</html>
相关文章:

JRT高效率开发
得益于前期的基础投入,借助代码生成的加持,本来计划用一周实现质控物维护界面,实际用来四小时左右完成质控物维护主体,效率大大超过预期。 JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式,觉得Spring打包…...

Spring Boot 切面的一种的测试方法,java中级开发面试
void afterReturnName() { Assertions.assertEquals(studentController.getNameById(123L).getName(), "测试姓名Yz");} } 但往往切面中的逻辑并非这么简单,在实际的测试中其实我们也完成没有必要关心在切面中到底发生了什么(发生了什么应该在…...

嵌入式自学路线-高薪路线(持续更新,欢迎关注)
1 入门:51STM32 主要学习内容中断、定时器、串口、NAND FLASH、网络控制器、LCD屏、触摸屏等的工作原理。学习资源推荐视频:野火,正点原子书籍:野火,正点原子学习建议如果你以后的方向是驱动开发,这部分学…...

SpringMVC的运行流程
SpringMVC的运行流程可以概括为以下几个主要步骤: 用户发送请求: 用户通过浏览器或其他客户端发送HTTP请求到服务器。 前端控制器(DispatcherServlet)接收请求: SpringMVC的前端控制器(通常是DispatcherSe…...

成绩分析 蓝桥杯 java
成绩分析 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入格式 输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一…...

计算psnr ssim niqe fid mae lpips等指标的代码
以下代码仅供参考,路径处理最好自己改一下 # Author: Wu # Created: 2023/8/15 # module containing metrics functions # using package in https://github.com/chaofengc/IQA-PyTorch import torch from PIL import Image import numpy as np from piqa import P…...

OpenHarmony开发技术:【国际化】实例
国际化 如今越来的越多的应用都走向了海外,应用走向海外需要支持不同国家的语言,这就意味着应用资源文件需要支持不同语言环境下的显示。本节就介绍一下设备语言环境变更后,如何让应用支持多语言。 应用支持多语言 ArkUI开发框架对多语言的…...

c++子类和父类成员函数重名
子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,…...

《C++程序设计》阅读笔记【7-堆和拷贝构造函数】
🌈个人主页:godspeed_lucip 🔥 系列专栏:《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…...

洛谷 P1048 [NOIP2005 普及组] 采药
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同…...

VMware vSphere虚拟化基础管理平台
VMware简介 VMware介绍 官网:https://www.vmware.com/cn.html VMware公司成立于1998年,2003年存储厂商EMC以6.35亿美元收购了VMware;2015年10月,戴尔宣布以670亿美元收购EMC。VMware公司在2018年全年收入79.2亿美元。 VMware主…...

leetcode刷题-代码训练营-第7章-回溯算法1
回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果} }理解 从…...

三种常见webshell工具的流量特征分析
又来跟师傅们分享小技巧了,这次简单介绍一下三种常见的webshell流量分析,希望能对参加HW蓝队的师傅们有所帮助。 什么是webshell webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、…...

pkg打包nodejs程序用动态require路由出现问题
动态路由问题 pkg打包的时候会自动生成一个虚拟路径/snapshot/…会导致你的路径出现一些问题 而项目中依据route文件夹下的文件动态use相应的router,这就需要动态require,但是这个require的路径会被虚拟路径代替导致取不到,所以可以使用写死…...

设计模式(018)行为型之策略模式
策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个对象,并使它们可以互换。策略模式使得算法的变化可以独立于使用算法的客户端。在策略模式中,有三个核心角色:策略接口(Strategy&#…...

c++关键字: =delete和=default
delete 概述 delete关键字是c11新增的关键字,主要用于的场景是:当我们不希望类中的函数被类对象在外部调用的时候,我们就可以使用这个关键字。 其实,之前我们实现这种功能是将这些函数放在private修饰符下,但是这种方…...

JSON
文章目录 JSONJSON 的定义格式快速入门JSON 对象和字符串对象转换JSON 在 java 中使用JSON与java对象的转换JSON与List集合的转换JSON与Map的转换 JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式…...

Python | 超前滞后分析
Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋,所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常,异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…...

Linux CPU利用率
Linux CPU利用率 在线上服务器观察线上服务运行状态的时候,绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如,随手拿来的一台机器,top 命令显示的利用率信息如下 这个输出结果说简单也简单,说复杂也不是那么…...

vue3实现导出pdf、png功能
准备做的系统中出现了 想导出当前页面的png或者pdf设计数据较多后端做可能比较麻烦 就自己研究了一下 1、安装html2canvas 、jspdf包 npm install --save html2canvas // 可以将dom元素转为一张图片 npm install --save jspdf // 导出为PDF格式 2、vue组件中引用&#x…...

what is tty?
waht is tty? 黑话:TTY 为什么使用Linux的时候CtrlC就会终止一个命令运行,ta是如何设置的? stty -a 桌面切换 CTRL ALT F1 – 锁屏 CTRL ALT F2 – 桌面环境 CTRL ALT F3 – TTY3 CTRL ALT F4 – TTY4 CTRL ALT F5 – TTY5 CTRL ALT F6 – TTY6...

在vite中限制node版本
1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…...

07 Php学习:运算符
PHP 算术运算符 在 PHP 中,算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法、取余数,负数运算、取反和并置运算。以下是这些运算符的详细解释和示例: 加法运算符 :用于将两个数值相加。 $a 5; $b 3;…...

做了多年前端,有没有想在python,go,nodejs,.net,java,c++中学一门后端,推荐
作为一名经验丰富的前端开发者,选择学习后端技术是一个重要的职业发展决策。Python、Go、Node.js、.NET、Java和C都是强大的后端开发语言,每门语言都有其特定的优势和应用场景。以下是对这些技术的分析,以帮助你做出选择: 目录 …...

JR-SMD201-P便携式网络解码器
详细介绍: JR-SMD201-P便携式网络解码器采用1/2U设计,支持AVS/H.265/H.264/MPEG2解码,支持IP输入,支持1080P/1080I/720P/576I/480I多种分辨率,支持DRA/AC3/EAC3/AAC/MPEG等音频。 产品特点 支持输入方式IP 接口丰富&a…...

线程池阻塞队列的选择
一、背景 想起前两年被问到阻塞队列怎么选,有界是必然的, ArrayBlockingQueue、LinkedBlockingQueue怎么选呢。 二、打开源码看看 ArrayBlockingQueue arrayBlockingQueue new ArrayBlockingQueue(3);LinkedBlockingQueue linkedBlockingQueue new Lin…...

linux内核驱动-在内核代码里添加设备结点
linux中,一切皆文件 我们在用户层用一些系统函数(如:fopen等等)时,会进入内核,内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的(驱动)函数 我们在前面已经…...

【算法优选】 动态规划之简单多状态dp问题——贰
文章目录 🎋前言🌴[买卖股票的最佳时机含冷冻期](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/)🚩题目描述🚩算法思路:🎈状态表示:🎈…...

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )
文章目录 13.路径总和13.1问题13.2解法一:递归13.2.1递归思路(1)确定递归函数参数以及返回值(2)确定终止条件(3)确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一:递归…...

代码学习记录37----动态规划
随想录日记part37 t i m e : time: time: 2024.04.06 主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及四个方面: 完全背包;零钱兑换 II ;组合总和 Ⅳ 和单词拆分 …...