青梅煮酒杂技

遇到的问题

1.properties文件中中文乱码解决:

打开Window->Preferences->General->Content Types->Text->Java properties File/Java Source File:

再下面默认编码出修改成UTF-8即可:

里面还封装了自动计算列宽方法:

效果就是系统中比如下图菜单路径,更宽。

下图是一个js查询方法:参数一是列表元素,参数二后台控制器,参数三默认用第几列排序,参数四是上面介绍的,参数五六是页面太宽出现滚动条时最右列固定死,左边不管,最后一个参数:加载完时回调下面的方法。

查询:

查询后台代码介绍:

PageList是分页方法:自己根据需要写即可

PageInfo是固定的。

增删改查

执行方法:参数二用于区分是哪个按钮。这个方法也是封装在public-js里面的

下图,前台中的name 值必须与后台pojo类中的字段完全相同:

因为后台中实例字段是作为方法参数的,可能应该与SpringMVC参数自动映射有关。

SQL语句需要自己写,列表内容要写,前端很多东西表头等复制过来即可,主要在于改动。

有时候需要插入两个表主副表插入失败回滚即可。

SVN
情况一:新建的项目

右键->team->share project

这时候会有一个弹窗选择SVN然后继续:会选择资源库

点击继续后:可以指定文件夹名,默认选择项目名称作为文件夹名

然后点击next与finish,这时:出现黑色雪花图标,代表本地代码没提交,SVN上已经有对应目录了,

然后全部选中,点击OK:提交成功。

提交过后再点击右键->team,就变样了:但是可以断开连接

自己写了一个新类:这时候左侧图标出现黑色雪花,代表svn上已经有了,但版本不一样类图标上出现蓝色问,代表svn中完全没有。

然后右键与资源库进行同步:出现的这个弹窗点击OK即可:

自己新建的东西一般没有冲突:按住ctrl选中自己新建的两个目录单独进行右键提交:

提交完成后:所有标志消失:

这事再点击与资源库同步:弹窗提示无任何变化:

如果出现红色叹号:右键项目选择:build path

发现svn上项目环境与本地不一致,选择一下即可:

窗口:windows->preferences->Java->Installes Jres->Add:

然后点击next再点击Directory选择本地jdk目录->打勾点击ok即可

最后再选择tomcat7,就不会再报错了。

与资源库同步时黑色代表你新添加的:荧光笔部分黑色箭头带加号,表示出你的与资源库中的添加的位置。

蓝色代表别人提交的你需要更新的,红色代表冲突

冲突:左侧是本地的,右边是别人提交的:

此时右键无法提交,应该点击更新。

更新完后出现了几个文件:

此时打开这个类:已经给你标注出了上面的是你的,下面是别人写的,加入两者不冲突,将标记直接删掉,相当于合并,然后删掉那三个版本号文件,再进行同步,再提交即可。

历史纪录

某个类右键:team->显示资源历史纪录

这时会出现这个类的历史版本,版本号提交者,鼠标点击可以打开这个版本,好处是如果某段提交过的代码意外丢失,就可以找到:

情况二:检出的项目

提交时:选中项目鼠标右键->与资源库同步。

一定要先同步,不能直接提交。

提交要慎重,不要乱点,有冲突时要查看清楚再考虑是否提交。

黑色代表自己写的SVN上没有的,可能需要提交,蓝色代表别人提交的你的本地没有。红色代表冲突,你们修改了相同的东西,但是其他人提交的比你早。

写完代码,要测试好再提交。

有冲突先更新,将他们的版本更新下来对比。

框架和列表搜索

使用一个参数的,就是字符串拼接,可能有注入风险,使用两个参数的,是字符串替换。

还有批量执行语句,一般不建议使用,单独执行如果失败还可以回滚。这个方法也有两种,如果使用两个参数的,一条sql对应一个object,即使用不到,也需要一个空的object数组。

开发步骤,找到套红模板或者某个自己想做的,找到它的路径对应的方法,然后将这个方法复制到自己建立的以自己名字命名的类里。以及这个方法设置的jsp页面,将这个jsp代码复制到自己建立的jsp中,相应的东西改改,没用的东西删除。

修改后台tomcat重新编译有可能会内存溢出,这时候重启即可,重启之后浏览器输入服务器地址与项目名:一般可以直接登录因为session还没有被清空。

附件上传下载

附件也是看公文套红模板菜单

点击增加按钮,出现一套比较简单的附件上产与下载方法。

附件主要有两个部分,第一部分是上传保存,第二部分是回显查询。

右键查看框架源码,地址栏里面找到相应控制器中方法。并且该方法中设置了前端页面是哪一个。

JS用的是BootStrap附件上传插件。

上传附件:上传其它数据,在划线方法的return中定义数据,附件表属于副表,他需要和正常的业务主表有关联,在return中需要将主表id传过去。

这里面实现的内容就是先把文件内容存到服务器,之后再去写入数据库。

上图return中的三个参数:

参数名是不可以改的,参数值可以自定义。

参数二:修改时有这个值:要从数据库里查这个数据,所以页面中可以回显(查看)id。但是新增时必须生成一个ID,并且传给前台。前台是通过el表达式获取到的。、既然参数二是与主表关联的id .所以上面有一个隐藏域,对于后台新生成的ID放到了这里:正常保存页面时,他也传给了后台。后台SQL语句要注意,必须保存的是从前台传的(一保存生成的id。如果误插入为其他数据,会导致关联不上)

保存

点击保存按钮

使用的是ajax,异步上传:

点击保存按钮时:保存方法:然后回调附件上传方法

然后异步上传成功时关闭弹窗:相当于ajax中的success,ajax异步上传情况下千万别在下面直接写窗口跳转,因为不确定谁先执行完,有可能ajax数据还没传到后端,窗口跳转就执行完成了。

上图中主要是back方法,使用时,直接复制即可。

总结,保存按钮:dosave保存正常数据,然后reuplod,进行判断如果有附件,调用附件上传方法,如果没有附件直接跳转到列表页面。有附件上传成功时,会走上图方法,相当于ajaxsucess,跳转列表页面。

点击增加按钮,右键查看框架源码,地址栏中找到该方法:

上传插件要求的格式都在这个方法中拼接成json了:

将查询内容分割成连个字符传,map形式返回,然后控制器传给前台:

修改时,只修改getFJList这两个参数即可:、

两个参数与前台新增时的两个参数值要相同:就可以查新出来,就能查看

第四天Excel导出

用户信息管理中可以点击导出Excel按钮,默认导出所有用户信息,也可以点击用户序号选择想要导出的用户(后台进行过滤查询)。

导出的时候这两种方式一定要实现,可选或不选导出内容。

右键审查元素会有路径,通过路径可以找到后台类:

可以看到前台按钮绑定了相应事件:

通过checkbox知道用户选择的数据,ID拼凑起来发送到后台。

这是前台封装好的代码,参数四就是CheckBox中选中的ID:

后台代码都是封装好的:

network中查看前台传输的信息:

有勾选情况selectid不是空的:

还传了一个数据叫colcount是列的数量,后台要用这个进行遍历:八列内容:就是为了Excel中表头与前台一致,当然checbox与最后一列Excel中给去掉了。

这个循环就是用colcount进行遍历:这块代码基本都是不变的。

通过人员信息查询数据:前台选择了pd就有值,前台没勾选默认pd 是空的。表头有了数据也有了就交给2007这个封装类帮我们实现数据的组装与下载,方法都是固定的。写service类中自己方法的时候就叫getPagelist不要起别的名称,要对原来继承的方法进行重写,就是对继承的baseservice类中的方法进行重写。这样做列表时才比较简单。

了解一下查询代码,参数是前台传过来的数据:pagedata是封装了request

验证邮箱:

^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$

Oracle自增,先创建自增序列,当插入时,主键自增触发器

<option value="1" <c:if test="${schoolpojo.xxxz =='1'}">selected</c:if>>教学性质</option>
							    <option value="0"<c:if test="${schoolpojo.xxxz =='0'}">selected</c:if>>研究性质</option>

必填验证:

	//必填验证
	var validate = $('#myform').bootstrapValidator({
		trigger:'input blur focus',
		fields:{
            xxmc:{
            	validators:{
            		notEmpty:{
            			message:'不能为空'
            			}
	           }
	        },
            jss:{validators:{notEmpty:{message:'不能为空'},
            	regexp:{
					regexp: /^[0-9]*[1-9][0-9]*$/,
					message:'只能输入正整数'
				}}},
            xxyx:{validators:{notEmpty:{message:'不能为空'},
            	regexp:{
				regexp: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/,
				message:'请输入正确邮箱格式'
			}}},
            lxfs:{validators:{notEmpty:{message:'不能为空'},
            	regexp:{
				regexp: /^((0\d{2,3})-)?(\d{7,8})$|^1[3456789]\d{9}$/,
				message:'请输入正确号码'
			}}},
    }});

regexp: { regexp: /^[a-zA-Z0-9_.]+$/, message: '密码由数字字母下划线和.组成' }

Jstl就是后台向前台传数据的(读取后台的输入),前台往后台传数据靠的是name属性与后台的pojo字段一样。

这里面的IP改成了自己的

然后双击bat打开

[全国教育经济信息管理平台-登录界面](http://localhost:8085/JYJF/login/login_toIndex)

navicat密码:

另一个账套:23456是高级别的

oracle11g口令lsp0655

年报系统:web.xml中这个地方,IP地址改成自己的了。redis.xml中两个host也都改成了自己的IP地址。

<filter>
  <filter-name>refererFilter</filter-name>
  <filter-class>com.googosoft.filter.RefererFilter</filter-class>
  <init-param>
    <param-name>referer</param-name>
    <param-value>http://localhost,http://127.0.0.1,http://172.22.27.2,http://192.168.11.129</param-value>
  </init-param>
</filter>

在这个表里添加路径

想要能更新的查询结果:

select * from JYJF_MKB_2021 t for update
 /ggtz/goGgtzPage 
编号: 375EBC06FDA2468C86DFC0148230E2DC

在这张表中插入之后,在系统中,系统管理,角色管理,点击部级单位的操作权限,找到自己的模块,设置为有权。

教育经费年报系统,教育部级别用户账号00 密码1。

Eclipse中获取getter setter快捷键:Alt shift S 或者右键source

看不懂的就上网查,一层一层的追溯,直到自己完全会写。

findPageList

PageDao extends BaseDao

PageService extends BaseService

( 
 SELECT  
GID,BT,DQDM, to_char(FBSJ,'yyyy-MM-dd')as FBSJ,FBR, FJ,decode(K.FBZT,  '0', '未发布', '1', '已发布') as FBZT,decode(K.SFDWGK,  '0', '否', '1', '是') as SFDWGKMC,
(select  A.RYBH  FROM RYB A WHERE A.GUID = K.FBR) as RYBH,
(select 'RGF673AED21C4147BDC8C4CA27C345TY' from dual) as DQRYBH,
(select '('||A.DWDM|| (CASE WHEN NVL(A.RYBH,'-1') != '-1' THEN '_' || A.RYBH  ELSE '' END)||')'||A.XM  FROM RYB A WHERE A.GUID = K.FBR)   as  FBRXM  
FROM GGTZ K 
)  K 

decode(K.LX,  '0', '一般', '1', '紧急') as LX,

full.GGTZSJ+full.GGTZSH+full.GGTZXJ+full.GGTZXX

 	{title:"公告通知查看权限",data:"GID" ,defaultContent:"",type:"string",'render': function (data, type, full, meta){
			     	   		return full.GGTZSJ+full.GGTZSH+full.GGTZXJ+full.GGTZXX ; },"class":"text-left"},
			     	   		
{title:"公告通知查看权限",data:"GID" ,defaultContent:"",type:"string",'render': function (data, type, full, meta){
			     	   		
			   return 
			   
			  (full.GGTZSJ||'')+(full.GGTZSH||'')+(full.GGTZXJ||'')+(full.GGTZXX||''); 
			     	   		
			     	   		},"class":"text-left"},
chenzhe1
oracle case when 用法
Case具有两种格式。简单Case函数和Case搜索函数。

第一种 格式 : 简单Case函数 :

格式说明

    case 列名

    when 条件值1 then 选项1

    when 条件值2 then 选项2.......

    else 默认值 end
  
  
  else 不是必须的

eg:

复制代码
    select 
    case   job_level
    when '1' then '1111'
    when  '2' then '1111'
    when  '3' then '1111'
    else 'eee' end
    from dbo.employee
复制代码
 

第二种 格式 :Case搜索函数

格式说明

    case

    when 列名= 条件值1 then 选项1

    when 列名=条件值2 then 选项2.......

    else 默认值 end

eg:

复制代码
    update employee
    set e_wage =
    case
    when job_level = '1' then e_wage*1.97
    when job_level = '2' then e_wage*1.07
    when job_level = '3' then e_wage*1.06
    else e_wage*1.05
    end
    
    至于 NLV
【语法】NVL (expr1, expr2)
【功能】若expr1为NULL,返回expr2;expr1不为NULL,返回expr1。
注意两者的类型要一致
SQL> SELECT NVL(NULL, 1) AS A, NVL(2, 1) AS B FROM dual;
列名 A B
列值 1 2
decode(K.ggtzsj,'1','省级',',') as ggtzsj

decode(K.ggtzsh,'2',',市级',',') as ggtzsh

decode(K.ggtzxj,'3',',县级',',') as ggtzxj

decode(K.ggtzxx,'4',',学校',',') as ggtzxx
select t.name,
       t.score,
       (case
         when t.score >= 90 then
          '优秀'
         when t.score >= 80 then
          '良好'
         when t.score >= 60 then
          '及格'
         else
          '不及格'
       end) 评分
  from t_score t;  //结果是散列
  
可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等。
(CASE WHEN K.ggtzsj='1' AND K.ggtzsh='2' then ',市级' WHEN K.ggtzsj IS NULL AND K.ggtzsh='2' then '市级'  WHEN K.ggtzsj IS NULL AND K.ggtzsh IS NULL then NULL  ELSE NULL END) as ggtzsh
第二版: (CASE WHEN K.ggtzsj='1' AND K.ggtzsh='2' AND K.ggtzxj='3' then ',县级' WHEN (K.ggtzsj IS NOT NULL OR K.ggtzsh IS NOT NULL) AND K.ggtzxj='3' then ',县级' WHEN K.ggtzsj IS NULL AND K.ggtzsh IS NULL AND K.ggtzxj='3' then '县级'  ELSE NULL END) as ggtzxj
县级最终版:(CASE WHEN (K.ggtzsj IS NOT NULL OR K.ggtzsh IS NOT NULL) AND K.ggtzxj='3' then ',县级' WHEN K.ggtzsj IS NULL AND K.ggtzsh IS NULL AND K.ggtzxj='3' then '县级'  ELSE NULL END) as ggtzxj
(CASE WHEN (K.ggtzsj IS NOT NULL OR K.ggtzsh IS NOT NULL OR K.ggtzxj IS NOT NULL) AND K.ggtzxx='4' then ',学校' WHEN K.ggtzsj IS NULL AND K.ggtzsh IS NULL AND K.ggtzxj IS NULL AND K.ggtzxx='4' then '学校' ELSE NULL END) as ggtzxx

delete from where

if (logger.isDebugEnabled()) {
			logger.debug("cmd查询语句:select "+pagelist.getKeyId() +" from "+pagelist.getTableName()+" where 1=1 "+ pagelist.getStrWhere()+ " "+ pagelist.getOrderBy());
			logger.debug("当前页的合计信息查询语句:select "+pagelist.getHj1() +" from "+pagelist.getTableName()+" where 1=1 "+ pagelist.getStrWhere()+" where "+pagelist.getKeyId() +" in ('是在临时表中的数据')");
			logger.debug("合计信息查询语句:select "+pagelist.getHj1() +" from "+pagelist.getTableName()+" where 1=1 "+ pagelist.getStrWhere());
			logger.debug("信息查询语句:select "+pagelist.getSqlText()+" from "+pagelist.getTableName()+" where 1=1 "+pagelist.getStrWhere()+" "+pagelist.getOrderBy() );
		}

有附件的页面,控制器:新增时,生成gid32位编码,编辑或查看时从请求中能得到编号,然后用这个编号去后台查询内容,二进制的内容解码后给前台

 

模块表中新建: /glyh/goCompanyTreePage/?pageUrl=/glyh/goRybTablePage

_pageUrl前台传过来的,是右边加载的路径

var _pageUrl="${ctx}${param.pageUrl}";

param.pageUrl就是数据库中问号以及后面的URL代表右侧列表页面,如果数据库中不写,可以在这里写成固定的。

还有这个:查树的节点的方法

通过这个分割窗体:左边树,右边列表,右边列表通过_pageUrl定位,这些东西基本都是固定死的,动态的东西在根节点

在left中定义了左侧树的一些属性,宽度,单击展开等。

执行URL中的方法与要传给后台的一些参数:

                            menu:'get-xjdw',  //区分是那个树,是个别名
                            saasdm: node.id,//加载的是第一级,nodeid就是root,每展开一次都查一次后台组装下面的节点,下及级别时id就是下级,可以进urldwjgTREE方法看怎么判断的
                            pageUrl:_pageUrl,
                            target:"iframe_list_${param.mkbh}",//右边列表名称
                            mkbh: "000000",//第一级就是六个0
                            method: 'POST',
                            type:_type

前台组装好这些参数后台方法在pd中获取到这些参数。

	public Object dwjgTree(){
		PageData pd = this.getPageData();
		String rootPath = this.getRequest().getContextPath();
		//获取请求参数
		String menu = pd.getString("menu");
		String saasdm = pd.getString("saasdm");
		String search = pd.getString("search");
		String xtbz = Validate.isNullToDefaultString(pd.getString("xtbz"),SystemSet.NBBZ);
		if(menu.equals("get-xjdw")){
			if (SystemSet.NBBZ.equals(xtbz)){
				if(saasdm.equals("root")){//第一次进就是root,点击其他节点就是其它
					return ryxxService.getPowerDwjgNode(pd,rootPath,search);//当前登陆人下的权限部门
				}else{
					return ryxxService.getDwjgNode(pd,rootPath,search);//某个部门下
				}
			}else {
				return ryxxService.getJbybRegionNode(pd,rootPath);
			}

		}else{
			return "";
		}
	}

查询根节点内容的方法:

/**
 * 获取权限下的组织机构单位(组织机构单位树)
 * @param rootPath
 * @return
 */
@SuppressWarnings("rawtypes")
public Object getPowerDwjgNode(PageData pd, String rootPath,String search) {
	String icon = rootPath+"/static/plugins/ext/resources/images/default/tree/folder.gif";//小房子的图标地址
	String Target = Validate.isNullToDefaultString(pd.getString("target"),"");
	String Href = Validate.isNullToDefaultString(pd.getString("pageUrl"),"");//右边列表的请求Url
	if(Validate.noNull(Href)){
		if (Href.indexOf("?") > 0) {//如果带参数,直接&拼上,不带参数,加个问号再拼上
			Href = Href + "&saasdm=";
		} else {
			Href = Href + "?saasdm=";
		}
	}
	ExtTreeNode node = new ExtTreeNode(SystemSet.TopDwFlag());
	List<ExtTreeNode> children=new ArrayList<ExtTreeNode>();
	List dList = ryxxDao.poweDwjgModel();
		Map map=new HashMap();
		if(dList.size()>0){//是否查出东西,遍历
			String dwmc="",saasdm1="",gid="",dqdmstr="";
			int xjcount=0;
			for(int i=0;i < dList.size();i++){
				map=(Map)dList.get(i);
				saasdm1 = Validate.isNullToDefaultString(map.get("dm"), "");
                String url = Href.length() > 0 ? Href + saasdm1 : Href;
                dwmc = Validate.isNullToDefaultString(map.get("mc"),"");
                dqdmstr = Validate.isNullToDefaultString(map.get("dqdm"),"");
	            xjcount = Integer.parseInt(map.get("XJCOUNT")+"");
	            if(xjcount<=0) {//根据有没有下级有走了两个不同构造方法
					children.add(new ExtTreeNode(saasdm1, "("+saasdm1+")"+dwmc, true, true, false, url+"&dwbh="+saasdm1+"&dwmc="+dwmc+"&dqdm="+dqdmstr, Target));//没有下级,是个叶子结点
	            }else{
					children.add(new ExtTreeNode(saasdm1, "("+saasdm1+")"+dwmc,  false, true, false, url+"&dwbh="+saasdm1+"&dwmc="+dwmc+"&dqdm="+dqdmstr, Target,icon));//不传这个图标,也会有个默认图标,区分有无下级
	            }
			}
			node.setChildren(children);
		}
	return node.GetChildrenJsonString();//组装成JSon返回
}

ryxxDao.poweDwjgModel:就是根据数据去数据库中查单位

Tomcat字符集:Server.xml

<Connector connectionTimeout="20000" port="8085" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

datatable
jexcel

getOutputStream() has already been called for this response

connect by level <= (regexp_count(a.str, ',') + 1))"

踩坑

<input type="hidden" name="dwjc" id = "dwjc" value="${dwjc}">

写在form-1表单中如果value有数据,就会变成获取列表页面的where条件放在所有语句的最后面

  pageList.setSqlText(" GUID,GSBH, JB, GS, JYXX, LX, ZJJG,FTYPE ,SPLITSTATE,TSCL,ZJGSLIST,ZJGS,SFXF");
        tableName.append(" (select GUID,FORMULAID AS GSBH,ZJGSLIST, TSCL as tscl, JBDM AS JB,zjgs,FORMULA AS GS,ERRORINFO as JYXX,FTYPE ,SPLITSTATE, decode(FTYPE,'1','强制','2','提示') as LX,ZJGSLIST as  ZJJG,decode(SFXF,'1','已下发','0','未下发') as SFXF "
        		+ "from "+ getFullTableName("ZDYGSB") +" where state='1' and DQDM = '"+dwbh+"'  ORDER BY GSBH) K");
        String selectId = pd.getString("selectId");
		if(Validate.noNull(selectId)){
			 sqlwhere.append(" AND GUID IN ('"+selectId.replace(",", "','")+"') ");
		}
        //表名
        pageList.setTableName(tableName + "");
        //主键
        pageList.setKeyId("GUID");
        // 条件
        pageList.setStrWhere(sqlwhere+"");
        //设置合计值字段名
        pageList.setHj1("");
        pageList = pageService.findPageList(pd, pageList);
        return pageList;

导出如果看到只有一两行的,说明service中只有一个获取列表数据方法(返回类型PageList):如这样

@RequestMapping(value = "/expExcelNew", produces = "text/json;charset=UTF-8")
    @ResponseBody
    public String ExpExcel(HttpServletResponse response) {
        return this.ExpExcel(response, sjglService);
    }

如果service有多个获取列表数据的方法就要这样写导出方法:

j将如下这里替换成自己写的方法:

full是数据库查出来的都能在这里展示。

信息查询语句,复制拷贝在plsql里面运行。

<td data-x="4" data-y="3" name="J_SL_XYZQC" style="text-align: right; white-space: pre-wrap;">0</td>
statistics_import.jsp
/jyjfbb2022/jb/statistics_import
JYJF_SYTJDR_2022

基表录入点击临时保存时,先判断,这个可以先不用看,往下会创建一个div元素,遍历每个td,如果当id等于name (能填写数字的单元格),如果是41到54行(钱数),给它们加两个零(可能是),放到创建的input里面,将div放到表单中,作为数据传给后台保存方法处理

console.log("${dwdm.indexOf("X")==-1}");//完全可用,虚设学校只有收入表支出表费用表,在那些表中判断即可。
文件存到这里了E:\eclipse-jee-juno\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\JYJF\WEB-INF\file\imgFile\excel

cffs拆分方式

所有数据都是0,临时保存是有日期的

学校类别代码,城乡分类代码,

单位代码,隶属关系代码,

地区代码。

"${ctx}/j2Controller_2022/goTbxx?FZR=" + $("#FZR").val() + "&TBR=" + $("#TBR").val() + "&LXFS=" + $("#LXFS").val() + "&TBRQ=" + $("#TBRQ").val()

"${ctx}/j2Controller_2022/goBdyyPage?dwdm=${dwdm}&lsgxmc=${lsgxmc}&xxlbmc=${xxlbmc}&dwmc=${dwmc}&jbdm=${bm}"

C增加U修改L查看

doSaveZcbzy,写语句插入表(向表中插入数据),没有的为0,然后将sql object与 一些参数放到doUpdateTbxx里面去执行
if(Validate.isNull(tbrq)){
				tbrq = DateUtil.getDay();
			}
			sqList.add(sql);
			objList.add(obj);
			单位代码与地区代码相同
			
			去状态表中jtable_data_state搜索有没有这个单位的数据有就更新没有就查询:
			comment on column JYJF_JTABLE_DATA_STATE_2022.state(拆分方式在这个表中有用)
  is '填写数据状态 1 临时 2通过校验 3无需填数据(需填写说明)4提交 51 县级未通过 52县级通过  53县区退回 54县级提交     61市级未通过  62 市级通过 63市级退回  64 市级提交  71省级未通过   72 省级通过 73省级退回  74 省级提交 81 部未通过 82部通过 83 部退回';
comment on column JYJF_JTABLE_DATA_STATE_2022.datavalid
  is '填写的数据是否属于教育部认定的有效数据 0=无效 1=有效'

然后

	doUpdateJ2data(sqList, objList, fzr, tbr, lxfs, tbrq, dwdm, xxlbdm, dqdm,  ztid, gjcf, reserved, lsgxdm, cxfldm,ZXXCFMode);
	//在这个方法中将sqlList又加入了几条语句。
		
return db.batchUpdate(sqList, objList);//执行以上语句

j2-1的state不太一样。也差不多

更新与插入数据都差不多,但是他是怎么判断更新与插入的?

前台保存请求方法成功后会把操作类型变为U,也就是,临时保存成功过一次,一定会都走更新,没有数据时会格式化会把操作状态置为C,没有数据这时候一定是插入)。点击清空单表,清空全部等都会设置该状态。中小学拆分后也会走更新。

根据此查询记录判断是否:

j2Servicve.getRecord(saasdm, xxlbdm, zxxcfxxlb, getFullTableName("J2_1",year), ztid)
j2Servicve.getRecord(saasdm, xxlbdm, zxxcfxxlb, getFullTableName("J2_7",year), ztid)
	sfcz = j2Servicve.getRecord(saasdm, xxlbdm, zxxcfxxlb, getFullTableName("J2_1",year), ztid);
					if (sfcz > 0) {
						operateType = "U";//能搜出结果,更新
					} else {
						operateType = "C";//插入
					}
去查询这些内容:
String sql = "select count(dwdm) from "+bm+" where dwdm=? and zxxcfxxlb=? and xxlbdm=? and ztid=? ";
		return db.queryForObject(sql,new Object[]{saasdm,zxxcfxxlb,xxlbdm,Validate.isNullToDefault(ztid, LUser.getDqZtid())},Integer.class);

2130获取价值量表预置上年数据

  MERGE INTO  要插入表名  别名
        USING
            (
                [write your query here]
            )[rename your query-sql and using just like a table] <---
        ON
            ([conditional expression here] AND [...]...)
        WHEN
            MATCHED
        THEN
        
            [here you can execute some update sql or something else ]
        WHEN
            NOT MATCHED
        THEN
            [execute something else here ! ]
            
        ---------------------------
通讯录导出

地区代码表:

地区代码code,地区名称name 地区代码所有的parentid都是他的上级。所有的地区都带有级别,数据库中levels字段 全国 1,省2 市3 县4 县本级与镇(街道)5

左边是上下拼起来,右边是left join

省本级在省后加7个0

如果是全国

省市

县 学校直接用like就行了

学校代码 code 学校名称 name 地区代码 DQDM

省市县都是没有学校的所有的学校都在其本级

select CODE ,NAME  from JYJF_REGION_2022 t WHERE CODE LIKE '371327%'AND LEVELS='5'

年报单位级次与地区中的levels不是一个概念,单位级次指的是能登录的用户:全国,省市县学校分别是0、1、2、3、4(镇与街道不能登录)直辖市级次与省相同,直辖市下的县仍然和普通县级相同:3

地区表中的levels单纯指的是地区概念,地区级别

全国单位级次0但是据库中levels是1

省级单位级次是 1 数据库levels是2

注意:季报中的级次又不一样,全国是1

select * FROM JYJF_REGION_2022 t WHERE CODE  = '37'

直辖市北京市下面的levels全都是4,区levels都与县一个级别

LPAD和RPAD分别是左补位和右补位  这个方法,有好几种,参数三不写就是补空格
replace(lpad(字段名,共几位),‘ ’,‘0’)   //replace是将参数二用参数三替换掉,两者结合,就变成了不足几位,补0
如运行 
select replace(lpad('123',5),' ','0') from dual 

省市:

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

CONCAT('你好, ', NAME) AS WELCOMESTRING,

单位代码 等于00

字符串拼接DWDM='"+LUser.getDwdm()+"' and DQDM = '"+LUser.getDqdm()+"' 

最终要获取到所有的value

String fileName ="导出通讯录"; response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "iso8859-1") + ".xlsx");

"{"success":true,"msg":"提交成功!"}"

以后所有的Sql语句但凡是查基表数据都要加状态。

北京市能改市与市本级
省市本级与直辖市下的区都是县级
县能改学校数据数据,改完状态4.
学校能填写数据的状态1,2,53
51,52是县在做校验。
全国能查到的状态:74 81 82 (83No,退回相当于未提交)
县能查到的状态4,51,52,54,61,62,63,64,71,72,73,74,81,82,83(已经提交了也能看)
市能查到状态54,61,62,64,71,72,73,74,81,82,83
省能查状态:64,71,72,74,81,82,83
直辖市能查状态:54,71,72,74,81,82,83
全国能查状态:74,81,82

加状态后:

全国

SELECT RE.CODE AS CODE,
       RE.NAME AS NAME,
       ST.TBR  AS TBR,
       ST.FZR  AS FZR,
       ST.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN (SELECT dwdm,dwoption,dqdm,state,datavalid,nulldescription,zxxcfmode,zxxcfextend,tbr,fzr,tel,updatetime,VERSION,ztid,thyy,fjmc,path  FROM JYJF_JTABLE_DATA_STATE_2022 WHERE state >74 AND state <>83) ST
    ON RE.CODE = ST.DQDM
 WHERE LEVELS = '2'
 ORDER BY CODE

with s1 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,CONCAT('', '') AS xxdm,CONCAT('', '') AS xxmc,ST.TBR  AS TBR,ST.FZR  AS FZR,ST.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN (SELECT dwdm,dwoption,dqdm,state,datavalid,nulldescription,zxxcfmode,zxxcfextend,tbr,fzr,tel,updatetime,VERSION,ztid,thyy,fjmc,path  FROM JYJF_JTABLE_DATA_STATE_2022 WHERE state >64 AND state <>73 ) ST
    ON RE.CODE = ST.DWDM
    WHERE parentid = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = '37')  ORDER BY CODE ),s2 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,ST.code  AS xxdm,ST.name AS xxmc,SE.TBR  AS TBR,SE.FZR  AS FZR,SE.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN JYJF_SCHOOL_2022 ST
    ON RE.CODE = ST.DQDM LEFT JOIN JYJF_JTABLE_DATA_STATE_2022 SE ON ST.CODE = SE.DWDM
    WHERE re.id = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = REPLACE(rpad('37',9),' ','0'))  ORDER BY CODE)
SELECT * from s1 union all  select * from s2

with s1 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,CONCAT('', '') AS xxdm,CONCAT('', '') AS xxmc,ST.TBR  AS TBR,ST.FZR  AS FZR,ST.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN (SELECT dwdm,dwoption,dqdm,state,datavalid,nulldescription,zxxcfmode,zxxcfextend,tbr,fzr,tel,updatetime,VERSION,ztid,thyy,fjmc,path  FROM JYJF_JTABLE_DATA_STATE_2022 WHERE state >54 AND state <>63 ) ST
    ON RE.CODE = ST.DWDM
    WHERE parentid = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = '3713')  ORDER BY CODE ),s2 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,ST.code  AS xxdm,ST.name AS xxmc,SE.TBR  AS TBR,SE.FZR  AS FZR,SE.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN JYJF_SCHOOL_2022 ST
    ON RE.CODE = ST.DQDM LEFT JOIN JYJF_JTABLE_DATA_STATE_2022 SE ON ST.CODE = SE.DWDM
    WHERE re.id = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = REPLACE(rpad('3713',9),' ','0'))  ORDER BY CODE)
SELECT * from s1 union all  select * from s2

with s1 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,CONCAT('', '') AS xxdm,CONCAT('', '') AS xxmc,ST.TBR  AS TBR,ST.FZR  AS FZR,ST.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN JYJF_JTABLE_DATA_STATE_2022 ST
    ON RE.CODE = ST.DWDM
    WHERE parentid = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = '371327')  ORDER BY CODE ),s2 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,ST.code  AS xxdm,ST.name AS xxmc,SE.TBR  AS TBR,SE.FZR  AS FZR,SE.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN JYJF_SCHOOL_2022 ST
    ON RE.CODE = ST.DQDM LEFT JOIN (SELECT dwdm,dwoption,dqdm,state,datavalid,nulldescription,zxxcfmode,zxxcfextend,tbr,fzr,tel,updatetime,VERSION,ztid,thyy,fjmc,path  FROM JYJF_JTABLE_DATA_STATE_2022 WHERE state >4 AND state <>53 ) SE ON ST.CODE = SE.DWDM
    WHERE parentid = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = '371327')  ORDER BY CODE)
 SELECT * from s1 union all  select * from s2 

直辖市

with s1 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,CONCAT('', '') AS xxdm,CONCAT('', '') AS xxmc,ST.TBR  AS TBR,ST.FZR  AS FZR,ST.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN (SELECT dwdm,dwoption,dqdm,state,datavalid,nulldescription,zxxcfmode,zxxcfextend,tbr,fzr,tel,updatetime,VERSION,ztid,thyy,fjmc,path  FROM JYJF_JTABLE_DATA_STATE_2022 WHERE state >71 AND state <>73 OR state=54 ) ST
    ON RE.CODE = ST.DWDM
    WHERE parentid = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = '11')  ORDER BY CODE ),s2 as (SELECT RE.CODE AS CODE,RE.NAME AS NAME,ST.code  AS xxdm,ST.name AS xxmc,SE.TBR  AS TBR,SE.FZR  AS FZR,SE.TEL  AS TEL
  FROM JYJF_REGION_2022 RE
  LEFT JOIN JYJF_SCHOOL_2022 ST
    ON RE.CODE = ST.DQDM LEFT JOIN JYJF_JTABLE_DATA_STATE_2022 SE ON ST.CODE = SE.DWDM
    WHERE re.id = (SELECT ID  from JYJF_REGION_2022 t WHERE CODE = REPLACE(rpad('11',9),' ','0'))  ORDER BY CODE)
SELECT * from s1 union all  select * from s2

使用了orderby 后面再加union,语法错误。

null变为字符串

null变为字符串:

Object s = null;
System.out.println((String)(s));  输出 null

操作记录

JBCZJL

select * from (SELECT ID,jbdm,dwdm,TO_CHAR(CREATETIME, 'yyyy-MM-dd') AS CREATETIME,DECODE(K.CZLX, '0', '临时保存', '1', '校验保存', '3', '清空单表', '4', '清空全部数据', '5', '非同级删除', '6', '决算导入', '7', '预置上年数') AS CZLX,(SELECT '(' || A.DWDM || ')' || A.XM FROM RYB A WHERE A.GUID = K.OPERATER) AS OPERATER FROM JYJF_JBCZJL_2022 K ) K where 1=1 AND (DWDM ='3111000415S')    order by CREATETIME desc

列表页面须知:

首先前台columns里面的data要和数据库中select的字段严格对应,比如主键,GID,数据库中若是ID就要改成ID.data就是要按照数据库中字段显示,在数据库中用decode,tochar等前端就不用做工作了。
前台full参数能获取所有数据库查询出的字段。

另外pageList.setStrWhere是要加在最外面的大括号后的,要加在最后,所以这里的条件在select 中应该查出来(子表)。还有前端参数中写好按某一列排序,数据库中就不用写了

高校非高校通过JYJF_SCHOOLCATEGORY_202 xxxz判断

如果是只有一个表的可以写死,不能修改。高校是1非高校是2

看单位代码位数

jb:全国,省市本级,县 县本级与县街道不会出现表,所以本级都是九位。

j1非高校 j2高校 j3县 j4市 j5 省单位代码两位。

前面的树重要的是单位编号

获得树节点的方法:传给后台这些参数?dwbh=${dwbh}&lsgxdm=${lsgxdm}&xxlb=${xxlb}&xxdqdm=${xxdqdm}

如果xxlbdm非空:

判断学校性质

 int length = dwdm.length();           
            if ("00".equals(dwdm) || "110000000".equals(dwdm)) {
            	selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where bh in ('010602','010601') order by xh";
			}else if (length == 2 && !"00".equals(dwdm)) { //省,单位代码不是00的
                //得先进行区划级别的确认
                //山东省  只有基本情况表 j5 山东省本级有 基表 济南市有j4表   济南市本级有 基表    历下区 有j3表还有基表
                selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where  bh = '010501'";

            } else if (length == 4) {//市
                selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where bh = '010401'";

            } else if (length == 6) {//县
                selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where bh in ('010301','010601')";

            } else {
                //这就是的等于9的  一般这个就得先去截取 看看一般都是各种本级加上街道

                if ("0000000".equals(dwdm.substring(dwdm.length() - 7, dwdm.length()))) {//省本级
                    selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where bh  = '010601'";
                } else if ("00000".equals(dwdm.substring(dwdm.length() - 5, dwdm.length()))) {//市本级
                    selectsql = " select  bh  as bh,mc,0 as xjcount from "+getFullTableName("cdb",year)+" where bh  = '010601'";
                } else {//剩下的就是街道了

                }
            }

如果是学校,

判断xxxz

如果不是学校

String xxlbdm = Validate.isNullToDefaultString(getXxlbdm(dwdm), LUser.getXxlbdm());
 public List getPowerQcpdNode(PageData pd) {
        String dwdm = Validate.isNullToDefaultString(pd.getString("dwbh"), LUser.getSaasdm());//获取这里  到后期得改 形成树上穿过值来
        
        String year = Validate.isNullToDefaultString(pd.getString("nd"), LUser.getDqNf());
        String ztid = LUser.getDqZtid();
        Map<String, Object> dqztAndNf = ztglDao.getNewNf();
		if (!year.equals(""+dqztAndNf.get("NF"))) {//不是当前年份账套
			ztid = ztglDao.getLsZt(year);
		}
        String xxlbdm = Validate.isNullToDefaultString(getXxlbdm(dwdm), LUser.getXxlbdm());/
公式修改
select t.*, t.rowid from JYJF_FORMULAS_2022 t where  gs like '%/%'

select t.*, t.rowid from JYJF_SQL_XTGS_2022XG t ORDER BY gsbh
SELECT '''||''' FROM dual

CREATE TABLE JYJF_SQL_XTGS_2022XG  AS SELECT * FROM JYJF_SQL_XTGS_2022 WHERE gsbh IN(select gsbh from JYJF_FORMULAS_2022 t where  gs like '%/%')

select t.*, t.rowid from JYJF_FORMULAS_2022 t where  gs like '%/%' AND gsbh = '11664'
http://192.168.11.129:8085/JYJF
if ("1".equals(xxxz)) {
                    <c:if test="${fictious == 'show'}">
                        <button type='button' class="btn btn-default bcs" id="btn_sytj" disabled="disabled">事业统计导入</button>
                    </c:if>   
String fictious;//虚设学校不展示事业统计导入按钮
		if(saasdm.indexOf("X")==-1) {
			fictious = "show";
		}else {
			fictious = "notshow";
		}
mv.addObject("fictious",fictious);

通过单位代码。联结学校与学校类别表,找类别表中有没有:如果返回空,证明不是学校。

 public String getSchoolCode(String saasdm) {
   	 String sql = "select c.code " +
   		  " from "+getFullTableName("SCHOOL")+" a" +
   		  " left join "+getFullTableName("SCHOOLCATEGORY")+" c on a.categoryid=c.id and a.ztid = c.ztid " +
   		  " where a.code=? and a.ztid = ?";
   	 return db.queryForSingleValue(sql, new Object[]{saasdm,LUser.getDqZtid()});
    }

option标签,有value属性时,value值是属性值,没有写value属性时,值就是选项值(innertext值)

这是需要改的:

select t.*,f.zjjg,t.rowid from JYJF_SQL_XTGS_2022 t left join jyjf_formulas_2022 f on t.gsbh = f.gsbh

where f.zjjg is not null  and t.gssql like '%fm%' AND t.gsbh NOT IN (SELECT gsbh FROM JYJF_SQL_XTGS_2022XG )

34ok从33往前找,

select t.*,f.zjjg,t.rowid from JYJF_SQL_XTGS_2022 t left join jyjf_formulas_2022 f on t.gsbh = f.gsbh

where f.zjjg is not null  and t.gssql like '%fm%' AND t.gsbh NOT IN (SELECT gsbh FROM JYJF_SQL_XTGS_2022XG )


CREATE TABLE JYJF_SQL_XTGSfor_2022XG  AS select t.*,f.zjjg from JYJF_SQL_XTGS_2022 t left join jyjf_formulas_2022 f on t.gsbh = f.gsbh

where f.zjjg is not null  and t.gssql like '%fm%' AND t.gsbh NOT IN (SELECT gsbh FROM JYJF_SQL_XTGS_2022XG )

JYJF_SQL_XTGSfor_2022XG

 switch (length) {
                case 2:
                    return RegionLevel.provincial;
                case 4:
                    return RegionLevel.city;
                case 6:
                    return RegionLevel.county;
                case 9:
                    if (code.endsWith("000")) {
                        //以000结尾,判断是否是本级;0000000--省本级;00000--市本级;000---县本级
                        if (code.endsWith("0000000")) {
                            return RegionLevel.county;
                        } else if (code.endsWith("00000")) {
                            return RegionLevel.county;
                        }
                    }
                    return RegionLevel.town;
                default:
                    break;
            }

UuidUtil.get32UUID()

搜索时间范围:

 where 1=1 AND (DWDM ='00')   and trunc(K.time,'dd') >= trunc(to_date('2022-12-07','yyyy-mm-dd'),'dd')    and trunc(K.time,'dd') <= trunc(to_date('2022-12-07','yyyy-mm-dd'),'dd')     order by CREATETIME desc
长度方法 WHERE (LENGTH(dqdm)=6 OR LENGTH(dqdm)=9)
	AND LENGTH(dwdm)=0
综表
综表新疆

新疆自己生成 带人员编号 全国生成 新疆不带 全国报表查询 新疆包含兵团。

如果是问号可以 as ztid

如果不是问号

MERGE INTO  z USING 
( ) k
 ON (z.ZTID = K.ZTID AND z.DQDM = K.DQDM AND NVL(z.RYBH, '-99') = NVL(K.RYBH, '-99') AND NVL(z.DWDM, '-99') = NVL(K.DWDM, '-99') AND z.LSJBDM = K.LSJBDM AND z.XUHAO = K.XUHAO)

WHEN MATCHED THEN  UPDATE SET 
WHEN NOT MATCHED THEN INSERT (
  
  ) VALUES()
  --z.z01=k.z01,z.z02=k.Z02,z.z03=k.Z03,z.z04=k.Z04,z.z05=k.Z05,z.z06=k.Z06,z.z07=k.Z07,z.z08=k.Z08,z.z09=k.Z09,z.z10=k.Z10,z.z11=k.Z11,z.z12=k.Z12,z.z13=k.Z13,z.z14=k.Z14,z.z15=k.Z15,z.z16=k.Z16,z.z17=k.Z17,z.z18=k.Z18,z.z19=k.Z19,z.z20=k.Z20,z.z21=k.Z21,z.z22=k.Z22,z.z23=k.Z23,z.z24=k.Z24,z.z25=k.Z25,z.z26=k.Z26,z.z27=k.Z27,z.z28=k.Z28,z.z29=k.Z29,z.z30=k.Z30,z.z31=k.Z31,z.z32=k.Z32,z.z33=k.Z33,z.z34=k.Z34,z.z35=k.Z35,z.z36=k.Z36,z.z37=k.Z37,z.z38=k.Z38,z.z39=k.Z39,z.z40=k.Z40,z.z41=k.Z41,z.z42=k.Z42,z.z43=k.Z43,z.z44=k.Z44,z.z45=k.Z45,z.z46=k.Z46,z.z47=k.Z47,z.z48=k.Z48,z.z49=k.Z49,z.z50=k.Z50,z.z51=k.z51,z.z52=k.z52,z.z53=k.z53,z.z54=k.z54,z.z55=k.z55,z.z56=k.z56,z.z57=k.z57,z.z58=k.z58,z.z59=k.z59,z.z60=k.z60,z.z61=k.z61,z.z62=k.z62,z.z63=k.z63,z.z64=k.z64,z.z65=k.z65,z.z66=k.z66,z.z67=k.z67,z.z68=k.z68,z.z69=k.z69,z.z70=k.z70,z.z71=k.z71,z.z72=k.z72,z.z73=k.z73,z.z74=k.z74,z.z75=k.z75,z.z76=k.z76,z.z77=k.z77,z.z78=k.z78,z.z79=k.z79,z.z80=k.z80,z.z81=k.z81,z.z82=k.z82,z.z83=k.z83,z.z84=k.z84,z.z85=k.z85,z.z86=k.z86,z.z87=k.z87,z.z88=k.z88,z.z89=k.z89,z.z90=k.z90,z.z91=k.z91,z.z92=k.z92,z.z93=k.z93,z.z94=k.z94,z.z95=k.z95,z.z96=k.z96,z.z97=k.z97,z.z98=k.z98
  
   ---
   --------------------------------------
    k.ZTID, k.XUHAO,k.DQDM,k.LSJBDM,k.Z01,k.Z02,k.Z03,k.Z04,k.Z05,k.Z06,k.Z07,k.Z08,k.Z09,k.Z10,k.Z11,k.Z12,k.Z13,k.Z14,k.Z15,k.Z16,k.Z17,k.Z18,k.Z19,k.Z20,k.Z21,k.Z22,k.Z23,k.Z24,k.Z25,k.Z26,k.Z27,k.Z28,k.Z29,k.Z30,k.Z31,k.Z32,k.Z33,k.Z34,k.Z35,k.Z36,k.Z37,k.Z38,k.Z39,k.Z40,k.Z41,k.Z42,k.Z43,k.Z44,k.Z45,k.Z46,k.Z47,k.Z48,k.Z49,k.Z50,k.z51,k.z52,k.z53,k.z54,k.z55,k.z56,k.z57,k.z58,k.z59,k.z60,k.z61,k.z62,k.z63,k.z64,k.z65,k.z66,k.z67,k.z68,k.z69,k.z70,k.z71,k.z72,k.z73,k.z74,k.z75,k.z76,k.z77,k.z78,k.z79,k.z80,k.z81,k.z82,k.z83,k.z84,k.z85,k.z86,k.z87,k.z88,k.z89,k.z90,k.z91,k.z92,k.z93,k.z94,k.z95,k.z96,k.z97,k.LEVELNUM,k.DWDM

综7的生成比较特殊

数据库有查询有四种运算:选择、投影、连接、除运算;而NOT EXISTS关键字则是基于除运算的查询。
delete from where not exist (select  xxx)
意思是select中能查到的不删除,select中没有的删掉
select中能查到的
只删不存在与select中的
select中能查到的是一小部分,这一小部分not exist后
in exists区别
一、in关键字
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

select * from A where id in (select id from B)
#等价于

for select id from B:先执行;
子查询 for select id from A where A.id = B.id:再执行外面的查询;
执行过程:in是先查询内表【select id from B】,再把内表结果与外表【select * from A where id in …】匹配,对外表使用索引,而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。 

小总结:当A表的数据集大于B表的数据集时,用in优于exists。【in适合外部表数据大于子查询的表数据的业务场景】
二、exists关键字 
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

语法格式:

select ... from table where exists (subquery);
可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE)来决定主查询数据结果是否得到保留。

如下:

select * from A where exists (select 1 from B where B.id = A.id)
#等价于

for select id from A:先执行外层的查询;
for select id from B where B.id = A.id:再执行子查询;
执行过程:exists是对外表【select * from A where exists …】做loop循环,每次loop循环再对内表(子查询)【select 1 from B where B.id = A.id】进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(所以尽量用小表),故内表大的使用exists,可加快效率。

例如:

select * from A where exists (select 1 from B where B.id = A.id)
提示

1. T 清单, 因此没有区别;EXISTS (subquery) 只返回 True 或 False , 因此查询的 SELET * 也可以是SELET 1 或其他,官方说法是执行时会忽略SELEC

2. EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解的逐条比对,如果担忧效率问题,可以进行实际检验以确定是否有效率问题;

3. EXISTS 子查询往往也可以使用条件表达式、其他子查询或者 JOIN 来代替,何种最优化需要具体分析;

小总结:当A表的数据集小于B表的数据集时,用exists优于in。【exist适合子查询中表数据大于外查询表中数据的业务场景】

三、in 与 exists 的区别
1、exists、not exists 一般都是与子查询一起使用,In 可以与子查询一起使用,也可以直接in (a,b.....)

2、exists 会针对子查询的表使用索引,not exists 会对主子查询都会使用索引。in 与子查询一起使用的时候,只能针对主查询使用索引,not in 则不会使用任何索引。

  注意:一直以来认为 exists 比 in 效率高的说法是不准确的。

  in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询。

  如果查询的两个表大小相当,那么用 in 和 exists 差别不大。

  如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

四、总结
select * from A where id in (select id from B)
select * from A where exists (select 1 from B where B.id = A.id)
1、如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

  其实我们区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。(都是以小表驱动大表);

2、in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询。一直以来认为 exists 比 in 效率高的说法是不准确的。

3、如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
————————————————
原文链接:https://blog.csdn.net/m0_50370837/article/details/124239171

insert语句改到综7,delete语句综4jc

delz2_1_1f 起这个名字的,太规范了,一目了然
"DELETE FROM "++" F WHERE NOT EXISTS ( " + 
				"SELECT ZTID,XUHAO,DQDM,LSJBDM,LEVELNUM,DWDM FROM "
				++" T WHERE "
				+s1+ ")"
    当需要使用preparedstatement时,非常有用。
  WHERE dqdm LIKE concat(?,'%')

这是上面的表的数据,往里面插入了这些数据。横向滚动条,后面除了账套id都是空的,账套id完全相同。

正则匹配方法,要看看。
Pattern cellRegex = Pattern.compile("^(?<StNo>(\\w|_)+)_");	
Matcher matcher = cellRegex.matcher(content);
地区状态表,地区状态。
查询是否可操作数据库。
* (1)地区代码由1~9位代码构成,采用国家统计局《统计用区划代码》12位中的前9位,其各代码表示为: 第1~2位,为省级; 第3~4位,为地级;
     * 第5~6位,为县级;
     * 第7~9位,为乡级。其中,001~099表示街道,100~199表示镇,200~399表示乡,400~599表示民政部门未确认的开发区
     * 、工矿区、农场等类似乡级单位。 (2)省、地(市、州、盟)、县 (市、区、旗)本级代码均在其各表示代码末位后加“0”补齐九位。
     * (3)对于没有国家统一地区代码的
     开发区
     * 、高新区、工业园区、工矿区等财政独立的县级及以上地区,由各省级教育行政部门汇总后统一报教育部,教育部审核通过后按下列规则编制:
     * 对于县级地区:第1~4位为其隶属的地级地区代码,第5位为大写的英文字母,第6位为自编顺序码(可以是数字也可以是英文字母)。
     * 对于地级地区:第1~2位为其隶属的省级地区代码,第3位为大写的英文字母,第4位为自编顺序码(可以是数字也可以是英文字母)。
本级
 if (code.endsWith("000")) {
                        //以000结尾,判断是否是本级;0000000--省本级;00000--市本级;000---县本级
                        if (code.endsWith("0000000")) {
                            return RegionLevel.county;
                        } else if (code.endsWith("00000")) {
                            return RegionLevel.county;
                        }
                    }

方法中任意位置调用 return 都会立刻返回。

有:first-child同样有last child
// +加号分隔:存在某个临接的兄长节点的 >>邻接兄弟节点<<
			// 通常用于在重复结构中,提取对应位置的元素
			$('.cls1+div').css('background-color', '#0F0');//相当于next()方法,本例有四个且仅有四个,有四个是因为加号前的选择器选出四个,仅有四个是因为仅仅选择他们的邻接。
			// ~波浪线分隔:存在某个同辈年长节点的  >>所有兄弟节点<<
			// 通常用于表头和后续同级单元的处理。
			// $('#div1~div').css('background-color', '#0F0'); //相当于nextAll()方法。

综表测试:

z1

		String sqlf187 = " INSERT INTO " + getFullTableName("z1f")
				+ " (id,ztid,xuhao,dqdm,lsjbdm,levelnum,z01,z02,z03,dwdm) "
				+ " SELECT sys_guid(),ztid,xuhao,dqdm,zbjt1.lsjbdm AS lsjbdm,zbjt1.levelnum AS levelnum,(NVL (zbjt1.z101,0)-NVL (zbjt1.z201,0)) AS z01,(NVL (zbjt1.z102,0)-NVL (zbjt1.z202,0)) AS z02,(NVL (zbjt1.z103,0)-NVL (zbjt1.z203,0)) AS z03,zbjt1.dwdm FROM ( "
				+ " SELECT ztid,xuhao,dqdm,lsjbdm,levelnum,SUM (z101) AS z101,SUM (z102) AS z102,SUM (z103) AS z103,SUM (z201) AS z201,SUM (z202) AS z202,SUM (z203) AS z203,dwdm FROM  "
				+ getFullTableName("z1f_jtemp")
				+ " where  dqdm like concat(?,'%') and ztid=? and rybh is null GROUP BY ztid,dqdm,xuhao,lsjbdm,levelnum,dwdm)  zbjt1 ";
//		String sqlf187 = "MERGE INTO "+getFullTableName("z1f")+" z USING ("
//				+ " SELECT sys_guid() as id,ztid,xuhao,dqdm,zbjt1.lsjbdm AS lsjbdm,zbjt1.levelnum AS levelnum,(NVL (zbjt1.z101,0)-NVL (zbjt1.z201,0)) AS z01,(NVL (zbjt1.z102,0)-NVL (zbjt1.z202,0)) AS z02,(NVL (zbjt1.z103,0)-NVL (zbjt1.z203,0)) AS z03,zbjt1.dwdm FROM ( "
//				+ " SELECT ztid,xuhao,dqdm,lsjbdm,levelnum,SUM (z101) AS z101,SUM (z102) AS z102,SUM (z103) AS z103,SUM (z201) AS z201,SUM (z202) AS z202,SUM (z203) AS z203,dwdm FROM  "
//				+ getFullTableName("z1f_jtemp")
//				+ " where  dqdm like concat(?,'%') and ztid=? and rybh is null GROUP BY ztid,dqdm,xuhao,lsjbdm,levelnum,dwdm)  zbjt1 "
//				+ ") k ON (z.ZTID=K.ZTID AND z.DQDM=K.DQDM AND NVL (z.DWDM,'-99')=NVL (K.DWDM,'-99') AND z.LSJBDM=K.LSJBDM AND z.XUHAO=K.XUHAO) WHEN MATCHED THEN\r\n" + 
//				"UPDATE\r\n" + 
//				"SET z.z01=k.z01,z.z02=k.z02,z.z03=k.z03,z.levelnum=k.levelnum WHEN NOT MATCHED THEN\r\n" + 
//				"INSERT (ID,ZTID,XUHAO,DQDM,LSJBDM,LEVELNUM,Z01,Z02,Z03,DWDM) VALUES (k.ID,k.ZTID,k.XUHAO,k.DQDM,k.LSJBDM,k.LEVELNUM,k.Z01,k.Z02,k.Z03,k.DWDM)";

修改前:"delete from " + getFullTableName("z1") + " where dqdm like concat(?,'%') and ztid = ? and rybh is null"

修改后:"DELETE FROM "+getFullTableName("z1")+" F WHERE NOT EXISTS ( " + 
				"SELECT ZTID,XUHAO,DQDM,LSJBDM,LEVELNUM,DWDM FROM "
				+getFullTableName("z1_jtemp")+" T WHERE"
				+ " dqdm like concat(?,'%') and ztid = ? and rybh is null)"
String delz2_1 = "DELETE FROM "+getFullTableName("z2_1")+" F WHERE "+s1+" and NOT EXISTS ( " + 
Object[] delobj = new Object[] { _dqdm, ztid,_dqdm, ztid };
delobj = new Object[] { dqdm, ztid,dqdm, ztid };
 "+s1+" and 
				+ " SELECT sys_guid() as id,ztid,xuhao,zbjt1.dqdm AS dqdm,zbjt1.lsjbdm AS lsjbdm,zbjt1.levelnum AS levelnum,zbjt1.dwdm AS dwdm, "
				+ " (NVL (zbjt1.z101,0)-NVL (zbjt1.z201,0)) AS z01,(NVL (zbjt1.z102,0)-NVL (zbjt1.z202,0)) AS z02,(NVL (zbjt1.z103,0)-NVL (zbjt1.z203,0)) AS z03, "
				+ " (NVL (zbjt1.z104,0)-NVL (zbjt1.z204,0)) AS z04,(NVL (zbjt1.z105,0)-NVL (zbjt1.z205,0)) AS z05,(NVL (zbjt1.z106,0)-NVL (zbjt1.z206,0)) AS z06, "
				+ " (NVL (zbjt1.z107,0)-NVL (zbjt1.z207,0)) AS z07,(NVL (zbjt1.z108,0)-NVL (zbjt1.z208,0)) AS z08,(NVL (zbjt1.z109,0)-NVL (zbjt1.z209,0)) AS z09, "
				+ " (NVL (zbjt1.z110,0)-NVL (zbjt1.z210,0)) AS z10 FROM ("
				+ " SELECT ztid,xuhao,dqdm,lsjbdm,levelnum,dwdm,SUM (z101) AS z101,SUM (z102) AS z102,SUM (z103) AS z103,SUM (z104) AS z104,SUM (z105) AS z105, "
				+ " SUM (z106) AS z106,SUM (z107) AS z107,SUM (z108) AS z108,SUM (z109) AS z109,SUM (z110) AS z110,SUM (z201) AS z201,SUM (z202) AS z202,SUM (z203) AS z203, "
				+ " SUM (z204) AS z204,SUM (z205) AS z205,SUM (z206) AS z206,SUM (z207) AS z207,SUM (z208) AS z208,SUM (z209) AS z209,SUM (z210) AS z210 "
				+ " FROM " + getFullTableName("z1_jtemp")
				+ " where dqdm like concat(?,'%') and ztid=?  and rybh is null GROUP BY ztid,xuhao,dqdm,lsjbdm,levelnum,dwdm)  zbjt1 "

 AND F.XUHAO = T.XUHAO AND F.ZTID = T.ZTID AND F.DQDM = T.DQDM AND F.LSJBDM=T.LSJBDM AND F.levelnum = T.levelnum AND F.DWDM = T.DWDM 
AnnotationConfigApplicationContext

人数是年初年末平均数 ( j2_1_02_01  * 8  +  j2_1_04_01  * 4 ) / 12 

比全部括号用if else写两套代码

update JYJF_ZDYGSB_2022 set state='2'


重新加载页面:

window.location.reload();

完成后成功弹窗信息,季度管理保存与自定义公式确认,取消确认,下发,取消下发,中都有

系统公式在JYJF_FORMULAS中

当被改变时,自动搜索

$("select").change(function(){
		$("#btn_search").click();
});

提交代码之前,要注意下面这种情况,不要把别人写好的给改了。

即使有冲突也要按字段解决。

各种各样的地区弹窗都在这里:

公式compare

!=0 /==1是选中 in

==0是not in

SQl 中if 与公式正反相同 then中不相同

SQL函数substr( j0.dwdm, 11, 1 ) = 'X'

					if (cellIndex == 1) {  //如果是 序号列
						if(i < 9){ //前9个  0开头(01、02、03....)
							value = "0"+( i+1 );
						}else{
							value = ""+( i+1 );
						}
						
						String cValue = cell.getStringCellValue();
						if (value.equals(cValue)) {
							cellIndex = 2;//这一步刚开始是不会走的,但后面index没++,所以f01又走了一边这里,变成2,直接跳出循环
							continue;
						}

						/*CellStyle newCellStyle = workBook.createCellStyle();
						newCellStyle.cloneStyleFrom(cell.getCellStyle());
						newCellStyle.setAlignment(HorizontalAlignment.RIGHT);
						cell.setCellStyle(newCellStyle);*/
						cell.setCellType(CellType.NUMERIC);
						cell.setCellStyle(styleCenter);
						cell.setCellValue( new XSSFRichTextString(value) );
						
					} 
	if (! (key.matches("F\\d(.*)") || key.matches("WC\\d(.*)") || key.equals("NAME")) ) //key2是隶属级别代码,直接跳出循环,index都没++,还是01,所以f01直接被填在了序号列
						continue;

21年整个doZbExcel()方法,一直到这个方法,

exportExcelUtilXzhz.doExpZbExcel();这个方法之前:读取了模板,获取了前台数据,查了表的详细信息,仅填充了前9行的信息。

可以考虑模仿这些,逐个改:

debug过程中发现这一步非常慢:

XSSFWorkbook xssworkBook = new XSSFWorkbook(fis);

自定义公式SQL

select * from JYJF_ZDYGSB_2022 where dqdm = '330326' order by formulaid;


--上面浙江,下面云南

select * from JYJF_ZDYGSB_2022 where dqdm = '3717' order by formulaid;

select t.*,t.rowid from jyjf_sql_zdygs_2022 t where  dqdm LIKE'33%'   AND gsbh = '3302000003014'                    dqdm = '330326' order by gsbh;

select t.*,t.rowid from jyjf_sql_zdygs_2022 t WHERE gsbh = '1504263157' 

--云南

select t.*,t.rowid  from  JYJF_SQL_ZDYGS_2022 t WHERE  dqdm = '3708' order by gsbh;
   AND J0.ZTID = '4D0DB043C24A48D3A181D880655C55BD'
   AND J0.DWDM = '3437000048S
SELECT *
  FROM JYJF_ZDYGSB_2022 J1
  LEFT JOIN JYJF_SQL_ZDYGS_2022 J2
    ON J1.FORMULAID = J2.GSBH
   AND J1.DQDM = J2.DQDM
 WHERE J2.DQDM LIKE '33%'
 ORDER BY J1.FORMULAID 


select * from JYJF_SCHOOL_2021 t LEFT JOIN JYJF_SCHOOLcategory_2021 c ON   t.categoryid=c.id WHERE c.code IN(25)
————————————————————————————————
select formulaid,dwdm,count(1) from jyjf_validtip_2022 where dqdm like '%'  and dyoption = 2  group by formulaid,dwdm  order by formulaid,dwdm

SELECT FORMULAID, COUNT(1)
  FROM JYJF_VALIDTIP_2022
 WHERE DQDM LIKE '4102%'
   AND DYOPTION = 2
 GROUP BY FORMULAID
 ORDER BY FORMULAID
 
 DELETE  FROM  JYJF_VALIDTIP_2022 WHERE DQDM LIKE '4102%' AND DYOPTION = 2
 
 
select * from gsxx_lsp
select * from JYJF_SQL_ZDYGS_2022 t where  DQDM LIKE '4102%'
AND  gsbh='4312GX29'


select * from JYJF_ZDYGSB_2022 t where DQDM LIKE '4102%'
and formulaid ='431200052' 


Delete  from JYJF_ZDYGSB_2022 t where DQDM LIKE '4102%'
and formulaid ='330326305' 

Delete  from JYJF_SQL_ZDYGS_2022 t where DQDM LIKE '4102%'
and gsbh ='330326305' 

DELETE FROM JYJF_VALIDTIP_2022  WHERE DQDM LIKE '4102%' 

select *  from JYJF_VALIDTIP_2022  WHERE DQDM LIKE '4102%' AND DYOPTION = 2 and formulaid ='4312GX29'

com.alibaba.druid
com.googosoft.gzbb.util.JySqlExecuter

在region表中加一个字段,查某个街道有没有这个学校,所有的学校都在街道下,市本级是县,县本级也是街道。

划拨后保存原来的代码,再次划拨给原来的地区后还原回该代码。

CONCAT(?, '%')

查,如果,这个被划拨的乡属性是有学校,那么,将其上级县市省,全部变成有学校。还需要考虑多乡划拨的情况。

即使是多乡划拨也是多个乡划到一个县,被划拨的乡不用管,仅仅将其上级不包括自己全都查一遍就行了。

接收被划拨县的乡只有一个,被划拨乡可能来自多个县

分别在1102原

1132现在,要修改的。

省市县。

新建学校,SchoolService334行

或者278行,region.getID

删除,写在1485,1494

全都传地区代码

多校划拨,要划拨的乡,和多个要划走的乡。

1508行,是要划拨的乡

划走的乡,参考1513,(1539循环下来有点多,再看看),放到1516行,底下。

给region表添加一列

必须新建一个表,再去联结表,如果建表直接将查询放进括号去联结会报错:

ORA-01779: 无法修改与非键值保存表对应的列。。。

update联结表时关联条件中,提供数据的表的列必须为主键

SELECT CODE, (SELECT COUNT(*) FROM JYJF_SCHOOL_2022 WHERE dqdm LIKE CONCAT(R.CODE,'%')) AS COUNT FROM JYJF_REGION_2022 R WHERE R.levels IN (2,3,4) AND ztid='4D0DB043C24A48D3A181D880655C55BD'
insert into jyjf_codecount(CODE,count)
SELECT CODE,COUNT FROM  (SELECT CODE, (SELECT COUNT(*) FROM JYJF_SCHOOL_2022 WHERE dqdm LIKE CONCAT(R.CODE , '%')) AS COUNT FROM JYJF_REGION_2022 R WHERE R.levels IN (2,3,4) AND ztid='4D0DB043C24A48D3A181D880655C55BD')
UPDATE    
  (SELECT A.NAME ,A.CODE AS recode ,A.levels ,A.EXISTSCHOOL ,b.code ,b.count FROM  JYJF_REGION_2022 A JOIN JYJF_CODECOUNT B ON A.code = B.code) O 
SET o.EXISTSCHOOL = (CASE WHEN o.count = 0 THEN 1 ELSE 0 END)

update中的join MySQL与oracle不一样,oracle必须这样先写好一个查询用括号括起来,MySQL能直接在update关键字后写表名然后join其他表

concat 参数某个字段,能够批量添加。

市上报xtlrkz1才上报,县不受影响

弹窗找:页面名称:ksj

String ztid = LUser.getDqZtid();
全部加上ztid
无学校地区

子查询第四种用法:where 后的列名也可以是个子查询,并且参与判断,其实也可以放到select中最为一个表,然后where直接使用

"select count(1)  from "+getFullTableName("region")+" r left join "+getFullTableName("region_state")+" s on s.dqdm = r.code and s.ztid = r.ztid " +
						" where (select count(t.id) from "+getFullTableName("school")+" t where t.ztid = r.ztid and t.dqdm like concat(r.code,'%')) >1 and r.ztid = ? " +
						" and parentid = (select id from "+getFullTableName("region")+" where ztid = r.ztid and code = ?) "+dqstate;
 新疆兵团
	        if ("65".equals(LUser.getDqdm())) {
	        	sql += " and r.code not like '6553%' ";
			}

树节点如果没有学校,那么地区便不再显示,饼

Sql一些方法,如果是本级,如果最后几位为0.

sql = "select t.code as dm, t.name  as mc,\n" +tjxxStr+
					"       t.code as dqdm, "
					+ " case when length(t.code)=9  then (select count(1) from "+getFullTableName("SCHOOL")+" s where  s.REGIONID=t.id and s.ztid=t.ztid"

					+ " ) else (select count(1) from "+getFullTableName("REGION")+" r where   r.ztid = t.ztid and r.parentid = t.id )  "
					+ " end as XJCOUNT,nvl(rs.state,1) as dqstate  from "+getFullTableName("REGION") +" t "
					+ " left join "+getFullTableName("REGION_STATE")+" rs on  rs.ztid = t.ztid and rs.dqdm= (case when substr(t.code,3,7) ='0000000' or substr(t.code,5,5) = '00000' then t.code  else substr(t.code,0,6) end)"
					+ " where  t.ztid= '"+ztid+"' ";					

区划树不能添加,如果是地区代码等于9,多数是镇,镇没有这个字段,都是空的/

直接将需求翻译成代码

选择器属性有关,[中括号]

伪类有关,:冒号开头

				// 如果需要元素同时满足多个属性选择器,并列(And并集),中间不能有空格
				//$('div[a][b]').css('background-color', '#0FF');
// :first-child 子元素,其地位是:第一个子元素 (所以10没被选中)
				$('ul>li:first-child').css('background-color', '#FF0');

自制:

嵌套casewhen代码

··· then(SELECT CASE EXISTSCHOOL  WHEN 0 THEN 5 WHEN 1 THEN  0 END FROM (SELECT EXISTSCHOOL FROM JYJF_REGION_2022 WHERE ZTID = '4D0DB043C24A48D3A181D880655C55BD' AND CODE = '3713'))···
自定义公式查询列表:
    		if($(":selected")[0].value=="已申请"){
    	        $("#btn_confirm").show();
    			$("#btn_cancelfirm").hide();
    		}else if($(":selected")[0].value=="已确认"){
    		    $("#btn_confirm").hide();
    		    $("#btn_cancelfirm").show();
    		}else if($(":selected")[0].value=="已生成"){
    		    $("#btn_confirm").hide();
    		    $("#btn_cancelfirm").hide();
    		} 
    		这是应该写在这个方法中的:
    		 $("select").change(function(){
    		$("#btn_search").click(); 		 
    	});
点击已申请时,取消确认按钮隐藏: 选择器可以尝试优化一下,不用数组
   if($(":selected")[0].value=="已申请"){
	   $("#btn_cancelfirm").hide();
   }
   应该写在下面这张图的位置。

可以这样优化:给select标签一个id 名为test

$('#test').val();
$('#test option:selected').val();
提交前
所有要提交的代码,要好好好好的检查一遍。即使不报错,也会有错误。
很多东西刚开始做不熟悉,写了,但是做完后其实没意义比如方法返回类型。
写代码的时候不是写完就可以了,而是写完再梳理一遍。
不是自己的注释不要带着
调试内容不能提交
表名不准写死,不要从plsql中复制过来就不管了
命名一定要规范,尤其是
修改别人的大段sql务必看好上下文是什么意思,不能只看孤立的一句就给修改了。
AND  existschool  = '0'//oracle中如果字段类型是number加引号判断是否等于数值型字符串也是可以的。
无论有没有条件,都别忘加ztid相等,包括on关联条件 where条件
 
起名一定要规范,否则自己都不知道怎么回事,是不是从审核菜单进入起了个shgsb结果自己都忘记了什么意思。
 (基表联结要 ON t.dwdm = j2_3.dwdm and t.zxxcfxxlb = j2_3.zxxcfxxlb and t.ztid = j2_3.ztid)三个条件决定一条数据
出现的错误:

00:

1.如果错误,前台清空,后台不清

2不要急躁,只会复制没有关联表却给表起别名,惯性使然。

3.

遍历数组,但是数组是空的。

for(String schoolcode:schoolcode_array) {

}

企业开发最好用list ,list用迭代器遍历优于循环遍历

4.

23.5.5,第三次犯ztid的错误:

SELECT CODE
  FROM JYJF_REGION_2022
 WHERE PARENTID =
       (SELECT ID
          FROM JYJF_REGION_2022
         WHERE CODE = '37'
           AND ZTID = '4D0DB043C24A48D3A181D880655C55BD')
业务问题,外层查询也要有ztid限定条件,因为地区信息都是复制原来的,只改了ztid .
编辑查看数据要加,关联表要加,子查询外曾查询要加,
仅仅查看某表数据也要加。

5.

分析表peovince city 全部复制的一个表,想当然,表中列不一样,出现错误。

取巧复制,几乎一定会出现问题。需要仔细观察并测试。

6.

23.5.18

最大的一次账套id

k

查询J345有没有数据时,子查询全部都没有ztid条件!

7.

一个地方加了参数,页面中还有一个列表渲染方法,没有加!

不仔细。

8.只想到了直辖市本级,忽略了直辖市下的所有地区状态也都是73,没有63(市退回)!


填写数据

用户功能授权添加新功能,

对用户功能授权,如果其有管理权限,弹窗提示,不再弹出功能授权页面

isExistGlqx(LUser.getDwdm(), rybh)

String sql = "select t.dwbh from jyjf_glqxb t where t.rybh = '" + dwdm + "'";
			List<Map<String, Object>> list = db.queryForList(sql);
			if (!list.isEmpty()) {
				return true;
			}
		}

$.ajax({
            type: "post",
            url: '${ctx}/systemset/qxgl/CzqxbController/isExistGlqxb',
            data: {
            	rybh: rybh,
                dwbh: dwbh,
            },
            dataType: "json",
            success: function (data) {
            	if(data.success){
            		alert(data.msg);
            	}else{
            	   	doOperate("${ctx}/systemset/qxgl/CzqxbController/findCzqxszList?dwbh="+dwbh+"&rybh="+guid,"L");
            	}
            },
            error: function () {
                alert("出现异常,请重试");
            },       
        });

密码在人员表

管理权限表glqxb

系统录入控制字段AC_SYS_XTB

用户管理权限已经改了,不能保存成空了。

已经有两个街道有权限,取消一个,也不行。修改这个问题。

13,15秒之间

简单的查询,即使有一万条数据,也只有两秒多。

联结四个表,每个表都是子查询

点重新选择,页面清空数据库也能清空

1096509.8

无学校地区不查: J2controller 与J2Dao

用户管理权限清空:

YhglqxController Service,Dao + LIst.jsp

管理权限涉及的还有这些:

管理授权是给县用的

没有街道用户,复制一个用户给他赋权部分学校,他就能管理这部分学校了,是折中方法。

审核退回,如果他是管理权限用户,它只能查到

全部退回时,如果按照地区代码,会给全退回去

临时人员没有审核退回模块,要加上

String rybh = LUser.getRybh(); //001

boolean isglqx = isGlqxb(dwdm, rybh);//

   boolean isglqx = isGlqxb(dwdm, rybh);
   if (isglqx) {
	   String getDmSql = "select distinct t.dqdm from jyjf_glqxb g left join "+getFullTableName("SCHOOL")+" t on (t.code = g.dwbh or t.dqdm = g.dwbh) and t.ztid = '"+ztid+"' where g.rybh = ";
	   if (null != rybh && !"".equals(rybh) && !"null".equals(rybh)) {
		   getDmSql += "'" + dwdm + "_" + rybh + "'";
	   } else {
		   getDmSql += "'" + dwdm + "'";
	   }
	   bscDmList = db.queryForList(getDmSql);
   }
就参考这个:
		if (isGlqxb(dwdm, rybh)) {
			if (null != rybh && !"".equals(rybh) && !"null".equals(rybh)) {
				dwdm += "_" + rybh;
			}
			sql += " and s.code in (select t.code from "+getFullTableName("SCHOOL")+" t left join jyjf_glqxb g on (t.dqdm = g.dwbh or t.code = g.dwbh) and t.ztid = '"+ztid+"' where g.rybh = '" + dwdm + "') ";
		}

LUser.getDlzh(

public boolean sfgxqx() {
	String glqx = "select count(1) from  jyjf_glqxb where rybh = ?";
	int num = db.queryForObject(glqx,new Object[] {LUser.getDlzh()}, Integer.class);
	return num>0? true :false;
}

审核退回历史数据功能更新,过录表、分析表县级过录,

6

分析表查询与过录表查询,市级用户查询数据时,选县级过录点击全部数据,会列出所有的县,无学校地区不再显示。

image-20230208144412536

模块表分三个级别,导航栏 是两位数

市levels是3

已完成 3/29

AND r.existschool = '0'

getF7fdata没做 f7f_2022

县填,市只上报,点通过

生成的是上报的 包括下面的市县

退回,生成就没有

状态控制

都是没上报,未收齐是下面的 报不全

审核中也是没上报,只是下一级上报全了

从生成表里拿,填数据表判断

三级全国,省市,县级别没有这个功能。

未收齐指的是省下面的市只上报了5个,审核中指的是下面的全部的市已经上报了,已上报就是已经上报。

错误提示 尝试1 右键项目–>team–>Refresh/Cleanup 失败 尝试2 右键工程---->选择team------>断开连接(注意不要删除svn文件) 重新share project工程并选择之前的资源库地址。 重新team并与资源库同步。 搞定...

地区levels全国:1 省2 地区 3 县4

省通过退回是市的状态,省提交才是省的状态,同样。市提交是市的状态
省市把数据提交了,县也会变。总结,省市不可能有县的状态,
但县提交可能会有这些状态'54','62','64','72','73','74','82','83'(直辖市除62,64) 县的上级状态改变,县也会变。

季报,找未填报的,就是找地区代码不在JB_QUARTER_2022表里出现的

修改驾驶舱填报数据情况未考虑直辖市的问题,修改已上报、审核中数据本级问题

季报中央本级是省,省本级竟然是个县。省市本级都是县。

指标解释,对比设置

JYJF_JBJS_2022

        $('.jexcel>thead>tr:eq(1)>td:eq(2)').attr('data-title',tooltips[0]).addClass('title');
		$('.jexcel>thead>tr:eq(1)>td:eq(10)').attr('data-title',tooltips[8]).addClass('title');
obj.updateNestedHeader = function(x, y, title) {
            if (obj.options.nestedHeaders[y][x].title) {
                obj.options.nestedHeaders[y][x].title = title;
                obj.options.nestedHeaders[y].element.children[x+1].innerText = title;
            }
        }
obj.showColumn = function(colNumber) {
            obj.headers[colNumber].style.display = '';//设置为空的意思是使用默认值
            obj.colgroup[colNumber].style.display = '';
            for (var j = 0; j < obj.options.data.length; j++) {
                obj.records[j][colNumber].style.display = '';
            }
        }
obj.updateColumnType = function(x, type) {
        	obj.options.columns[x].type = type;
        }
/**
         * Hide column
         */
        obj.hideColumn = function(colNumber) {
            obj.headers[colNumber].style.display = 'none';
            obj.colgroup[colNumber].style.display = 'none';
            for (var j = 0; j < obj.options.data.length; j++) {
                obj.records[j][colNumber].style.display = 'none';
            }
        }

结转情况是月报,是月报

session 写在UserService中的Login方法中

管理权限用户的模块添加,是添加在某个Dao方法中是ZcnbindexDao 中的getCdList方法。

外网:http://202.205.176.94/JYJF1/login/login_toIndex
insert select 语句
insert into JYJF_JZQKB_2022(recordid,dwdm,dqdm,lsgxdm,xxlbdm,cxfldm,ztid,state)
select sys_guid(),r.code AS dwdm,r.code AS dqdm ,'0'AS lsgxdm,'0' AS xxlbdm ,'0' AS cxfldm ,'E3E8AA0DA258D3C1E053010F12ACD10A' AS ztid ,'72' AS state
 FROM YB_REGION_2022 R
  LEFT JOIN JYJF_JZQKB_2022 J
    ON J.DQDM = R.CODE
   AND J.ZTID = R.ZTID
 WHERE R.LEVELS = 4
   AND R.ZTID = 'E3E8AA0DA258D3C1E053010F12ACD10A'
   AND R.CODE LIKE CONCAT('37', '%')
   AND (NVL(J.STATE, 0) < 72 OR NVL(J.STATE, 0) = 73)
   AND R.SFJH = '0'
 j  LEFT JOIN YB_REGION_2022  R ON R.CODE = j.dqdm AND r.ztid = j.ztid

导出

省过录要有计划单列市,市过录不再考虑直管县

原来的直辖市判断的保留,因为直辖市通过等状态变化,

但省级别过录时不仅要去掉单列市过滤还要用并集取到它们。

省级别过录表过录表生级别过录过录

市县级别过录原样显示,需要做的工作是让省加入直辖市。月报

isZxs(LUser.getDqdm()) || "1".equals(LUser.getYbSfjh()) //直辖市或计划单列市的判断
县级单位是不是计划单列市下的县:
yszxDao.isJhdls(dqdm.substring(0,4),year,ybid)。如果是收付实现制应该固定写2022
if ($('#myCheckbox').is(':checked')) {
  // 复选框被选中
} else {
  // 复选框未被选中
}
打印导出本地路径:E:/eclipse-jee-juno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp4/wtpwebapps/JYJF/

想用LUser,必须是现获得的单位代码而且要回答,县也会这样必须确定不是县。想用查询: 市有没有判断四位数dwdm与User判断市不一起,又有四位数问题了。

季报监测预警:放到指标解释后面。

						<label class="form-check-label"> 
						    <input type="checkbox" class="form-check-input" id="xsdbsz" value="">
						    <span class="fontxz">显示对比设置</span>
						</label>
对比设置:放到最下面
 
				            	<select id="jbmcSel" class="selectpicker  show-tick"
					                style="" data-actions-box="true"  onChange="nextChange()">
					                <c:forEach var="list" items="${jbmcLists.jbhldzb}">
					                    <option bm="${list.BM}" value="${list.XH}">${list.MC}</option>
					                </c:forEach>
				                </select>

要获取到数据,再获取到表名。

如果是同一行的

选中富元素,再选中同一行的

$("td.seled").text()
表头
<div class="dataTables_scrollHead" style="overflow: hidden; position: relative; border: 0px; width: 100%;"></div>
<div class="dataTables_scrollBody" style="position: relative; overflow: auto; width: 100%; height: 174px;"><div>
fileNodes[i].className.indexOf("fileDiv")
$("li").each(function() {
  console.log($(this).text()); // 输出每个 li 元素的文本内容
});
$("td.seled:first").parent().children().eq(2).text()//山东省本级
$("td.seled:first").parent().children('.seled').first().text()

const classList = element.classList;//类列表
const lastClass = classList[classList.length - 1]; //最后一个类
字符串的最后一个字符的索引是字符串长度减 1,因此索引 -1 指的是最后一个字符。因此,.slice(0, -1) 表示从字符串的第一个字符开始,截取到字符串的倒数第二个字符(即不包括最后一个字符),返回截取后的新字符串。
 var visited = new Set(); // 记录已经处理过的行
    $td.each(function(){
        var $tr = $td.parent();
        if (visited.has($tr)) {
            return; // 跳过已经处理过的行              这种方法,再框选同一行,无效,除非刷新页面。
        }
 
String data = pd.getString("data");
        if(Validate.noNull(data)){
            List<Map<String,String>> datalist = GsonUtils.GsonToListMaps(data);//将对象转成list 
​

问题库中的基表字段(字段与表名能够自动填充)

数据库中插入null
Validate.isNullToDefaultString(null, "")//往数据库中插入null的正确方法
Validate.isNullToDefaultString(null, null)//往数据库中插入null的错误方法 插入的字段为'null' 是null四个字母的字符串
直接写SQL时,xxx is null
$('#param').val('${jbzd}');
$('#tablename').val('${tablename}');//自动填充
 $(document).on("click", "#btn_delete", function() {
        var tbody = document.getElementById("data");
        var checked = tbody.querySelectorAll("input[type=checkbox]:checked");
        for (var i = 0; i < checked.length; i++) {//选择器选的数组,
            var value = checked[i].value;
            for (var j = 0; j < data.length; j++) {
                if (data[j].xh === parseInt(value)) {
                    data.splice(j, 1);
                    break;
                }
            }
            tbody.removeChild(checked[i].parentNode.parentNode);
            
        }
        location.reload();
    });


<c:forEach var="wtms" items="${wtms}" varStatus="status">
    <option value="${wtms.GID}">${status.index + 1}.${wtms.WTMS}</option>
</c:forEach>
数据1.  2.  这样

默认行为(default behavior)指的是在Web浏览器中,一个元素被触发(例如,用户点击链接或提交表单)时,浏览器自动执行的操作。这些操作是由浏览器预定义的,并且可以是跳转到新页面,刷新页面或提交表单等。默认行为的目的是提供一些基本功能,使用户与网站或应用程序交互时有一致的体验。
​
在Web开发中,有时候我们希望通过JavaScript代码来改变默认行为或防止默认行为的发生,例如通过event.preventDefault()方法来阻止链接的跳转或表单的提交等。
CSS Transition 是一种用于创建元素从一种样式逐渐转换为另一种样式的动画效果的方法。通过 CSS Transition 可以在不使用 JavaScript 或 Flash 等技术的情况下,通过添加或移除 CSS 属性,实现元素从一种状态过渡到另一种状态的平滑动画。
​
CSS Transition 通常使用 transition 属性来定义要过渡的 CSS 属性、过渡效果的持续时间和过渡效果的速度曲线。transition 属性可以被应用到所有 CSS 属性,使这些属性在状态变化时产生平滑的过渡效果。
​
CSS Transition 的工作原理是通过定义初始状态和结束状态,以及过渡效果的持续时间和速度曲线,来控制过渡的过程。当元素状态发生变化时,浏览器会根据过渡属性的设置,计算出过渡效果的变化情况,并在过渡效果的持续时间内逐渐地应用这些变化。这样就可以实现元素从一种状态平滑地过渡到另一种状态的动画效果。
​
以下是一些常见的 transition 属性值:
​
transition-property:指定要过渡的
CSS 属性的名称,多个属性可以使用逗号分隔。
transition-duration:指定过渡效果的持续时间,单位可以是秒或毫秒。
transition-timing-function:指定过渡效果的速度曲线,可以使用预定义的速度曲线,也可以自定义速度曲线。
transition-delay:指定过渡效果的延迟时间,即过渡效果在触发后多少秒开始执行。
使用 CSS Transition 可以为网站或应用程序添加平滑的动画效果,使用户界面更加生动和具有吸引力。
for (var i = trs.length - 1; i >= 0; i--) {//倒着循环

自动选中

<option value="1"<c:if  test="${wtk.WTLX eq '1' }">selected</c:if>>数据</option>

注意保存时判空(没有问题的情况)。问题类型基表。类型自动预置。

https://docs.qq.com/sheet/DSW9zWEZmQnFabWd3?tab=BB08J2&_t=1657779453186
月报表中兵团等级是市但parentid是全国,兵团师与年报县相同

兵团的单位级次是什么

在 Echarts 中,要使文本字体大小变小,除了使用 CSS 选择器以外,还需要针对 Echarts 中的文本元素进行样式设置。

具体来说,可以通过 Echarts 提供的 textStyle 属性来控制文本的样式,包括字体大小、颜色、字体粗细等。例如,可以使用如下代码来将文本字体大小设置为 12px:

javascript

option = {
  // 其他图表配置项
  textStyle: {
    fontSize: 12
  }
}
或者尝试
option = {
  // 其他图表配置项
  textStyle: { 
  },
  fontSize: 12
}
如果在 CSS 中设置了字体大小,而在 Echarts 中也设置了 textStyle.fontSize,那么最终的字体大小是二者之间取较大值。这是因为 Echarts 在渲染文本时会考虑文本的显示效果和可读性,如果字体过小会导致文本不易读取。

74 是省提交的82 全国通过的,点击撤回,全部变成0

数据库中有三个字段也都改成0

待退回不加,已提交,不加,已通过,不加,已退回,加

传给后台问题id,查问题id 是这个的同时state not in(82.0.74)还有创建人还有csid(类似账套)

if (Validate.noNull(cjr)){
    where += " and t.cjr = '"+cjr+"' ";
}
JYJF_JBHLDZ  行列对照表
可以尝试使用相对单位来设置字体和图片的大小,例如使用em或rem来设置字体大小,使用百分比来设置图片的大小。
另外,还可以考虑使用响应式设计来优化您的页面,在不同屏幕尺寸上提供更好的用户体验。您可以使用CSS媒体查询来为不同的屏幕尺寸设置不同的样式。例如,在小屏幕设备上,您可以通过调整字体大小和图片大小来优化页面布局。
@media screen and(max-width:1400px){
	html {
	    zoom:67%;
	}
}
"webView/jyjfbb2022/printReport/A4/fm/fm_j.rpt"
弹出校验信息时,变动原因,分析表
只有其他可以,其它以外的禁用,如果点击其他时已经填写了数据,点击出其他外的选项禁用,数据还有点击保存时清空数据。

快速信息附表加这两列:

select中option的值直接选,
var obj =$("#bhyylx").val().toString() ;//变化原因类型
if (obj.indexOf("其他")==-1 ){//字符串包含某个值
			$("#bhsm").val('');//textarea的值置空
type=hidden是不导出
分析表 过录表
http://192.168.11.174:8080/JYJF/login/login_toIndex

不在for循环中写select

update xxx = xxx直接用case when

javascript 
vat str;
str += 123;
str的結果就是'undefined123'要注意
同样的:
vat str = null;
str += 123;
str的結果就是'null123'要注意
解决方法:vat str='';
空字符串,没有空格。
var str 此时还不知道是什么类型
select MAX(to_number(bh))+1 from J

审核告示版中的当前账套:

select gid from JYJF_SHGSB_CSB_2022 where sfdq = '1'

数量查询

下级数量,全国省市县都不用管,只有街道,可查夏季数量。

UPDATE JYJF_REGION_2022 R
SET R.existschool = CASE
                        WHEN (SELECT COUNT(*) FROM JYJF_SCHOOL_2022 WHERE dqdm LIKE CONCAT(R.CODE,'%')) > 0 THEN 0
                        ELSE 1
                     END
WHERE R.ztid='4D0DB043C24A48D3A181D880655C55BD' AND R.levels = '5';

set中用case分支,分支时when用子查询,子查询中又用到外表条件。
逐个遍历
T.EXISTSCHOOL = '0' OR SUBSTR(T.CODE,7,5)= '000' OR SUBSTR(T.CODE, 3, 7) = '0000000' OR
              SUBSTR(T.CODE, 5, 5) = '00000'
              包括本级时,这样就不会影响。
              left join jo
jblrdbvalidtip数据变动原因表
別名t  参数 表名 条件 拼起来的
看好from條件,
注意最後的编号。
join改成left join 
var baddata = '[';
				var seledjbzd = '';
				$seled.each(function(index){
					baddata += $(this).attr('attrjbzdmc');
					baddata += ':';
					baddata += $(this).text();
					baddata += ',';
					seledjbzd += $(this).attr('attrjbzd');
					seledjbzd += ',';
					if (index === $seled.length - 1) {
						baddata = baddata.slice(0, -1); 
						seledjbzd = seledjbzd.slice(0,-1);
					}
				});
				baddata += ']';
String isnull = Validate.isNullToDefaultString(map.get("baddata"), "0");
			String baddata;
			if(!"0".equals(isnull)) {
				baddata = map.get("baddata").substring(1, map.get("baddata").length()-1);
			}else {
				baddata = "";
			}
			
学校类别代码,隶属关系名称,status= 0
输出结果:
如果两个表达式不相等,NULLIF 返回第一个 expression1 的值。
如果两个表达式相等,NULLIF 返回空值NULL。
SQLServer函数是一样的功能
例子: PRINT NULLIF('222','') --返回222
PRINT ISNULL(NULLIF('222','222'),'23') --返回23 证明返回的是null
解决除数为0的办法 decode三个参数版本。

DECODE((nvl(0,0) - nvl(0,0)),0,NULL,nvl(t.j_sl_nmfwjzmj,0) / (nvl(0,0) - nvl(0,0)))
如果为0查询结果为空,如果不为0查询结果就是参数四。
and exists (select 1 from  JYJF_BBSCJLB_2022 b where b.gid=z.zbgid and b.ztid=z.ztid and b.dqdm=z.dqdm)

集中不删除直接插入,单表先删除后插入,集中生成不用删除

集中生成先更新再获得刚更新的,单表获得之前的

集中生成时put到pd中,带到单个生成方法中

在生成时insert的时候,将gid插入

if (!"true".equals(jzsc)){
String zbgid = getBbscZbgid(pd,list,list1);
pd.put("zbgid", zbgid);
------        
首先:
String zbgid = Validate.isNullToDefaultString(pd.getString("zbgid"), "");
String jzsc = pd.getString("jzsc");
--
某表刪除时:
 if (!"true".equals(jzsc)){
 某表插入时insert zbgid,
 select ?
 list1.add(new Object[] {zbgid, dqdm, ztid });

分析表生成:

临时:

--S.DQDM = '1504'  OR
---NVL(S.DQDM, '1504') = '1504'
如果是空,设置默认值,恒等
易维护,能分析表直接有个共用方法,SQL都相同。
NVL2(RYBH, '_' || RYBH, '') 是空的,不是空的

空数据说明,清空学校数据
2115000338S

集中校验,报表生成,分析表生成

在 Oracle 中,可以使用 NVL 函数来替代 SQL Server 中的 ISNULL 函数。因此,可以将 isnull(nullif(x4-x5,0),1) 替换为 NVL(NULLIF(x4-x5,0),1)。因此,原始表达式可以改写为:

less
Copy code
ROUND(x3/NVL(NULLIF(x4-x5,0),1),0)
注意,ROUND 函数的参数顺序在 Oracle 中和 SQL Server 中是相反的,第一个参数是要进行四舍五入的数值,第二个参数是要保留的小数位数。因此,如果您的目标是将结果四舍五入到整数,那么可以将第二个参数设置为 0。

SUBSTR(DQDM, 1, 2) 的意思是从 DQDM 字符串的第一个字符开始,截取长度为 2 的子字符串。

SUBSTR(DQDM, 1, 2) 的意思是从 DQDM 字符串的第一个字符开始,截取长度为 2 的子字符串。
分析表市级查询 默认县级过录
$(document).on("click",".nobor",function(){
	     var bh= $(this).attr("bh");
	     var id= $(this).attr("nid");
	     var $nobor  =$(this);
	     confirm("是否刪除?",{title:"提示"}, function(z){
	    	 close(z);//使用confirm方法时,必须写,点击确定时才能关闭页面。
	    	//删除dom
			 	$nobor.parents(".fleft").remove();
			 	tabShow();
	 		 	window.parent.parent.delNodeAction(id,dwdm,zxxcfxxlb,cflx,sfwqxx,xxlbstr,xxlbdm);
	     });
	 });
共建拆分注释
		String id = jyjfj2_2f.getId(); //当前附表样例:ftjcfsrb-411-230100000-21
		String existList=this.getExistj2Fb(jyjfj2_2f.getDWDM());//获取已经存在的J2附表
		int Maxgjcf = this.getExistj2FbMax(jyjfj2_2f.getDWDM(), jyjfj2_2f.getZXXCFXXLB(), jyjfj2_2f.getZtid());//已存在的最大拆分数
		if(0==Maxgjcf){
			Maxgjcf=2;
		}else{
			Maxgjcf=Maxgjcf+1;
		}
		String[] nodearr = nodestr.split(",",-1);//全部的包括已存在的与新增的
		String[] nodearr2 = nodestr2.split(",",-1);
		//先去查询一个List 查询本地区已有的数据
		//进行判断如果是当前表的数据就进行更新,如果是进行
		//遍历这个数组,进行返回不存在的节点,然后准备插入 还得剔除当前这个节点的数据
		List<String> gjcfarr=new ArrayList<String>();//筛选各级拆分的东西
		List<String> existArr=new ArrayList<String>();//筛选各级拆分的东西
		// 备注信息
		List<String> list2 = new ArrayList<String>();
		//先筛选出新增的
		for( int i=0;i<nodearr.length;i++){//[ftjcfsrb-412-230100000-21, ftjcfsrb-412-230000000-22, ftjcfzcb-412-230100000-21, ftjcfzcb-412-230000000-22, ftjcfsrb-411-230100000-21, ftjcfzcb-411-230100000-21, ftjcfsrb-413-230000000-22, ftjcfzcb-413-230000000-22]
			if(existList.indexOf(nodearr[i])<0){//ftjcfsrb-412-230000000-12,ftjcfsrb-411-230000000-12,ftjcfzcb-412-230000000-12,ftjcfzcb-411-230000000-12
				existArr.add(nodearr[i]);//[ftjcfsrb-412-230100000-21, ftjcfsrb-412-230000000-22, ftjcfzcb-412-230100000-21, ftjcfzcb-412-230000000-22, ftjcfsrb-411-230100000-21, ftjcfzcb-411-230100000-21, ftjcfsrb-413-230000000-22, ftjcfzcb-413-230000000-22] 所以説,没有效果
				if(Validate.noNull(nodestr2)) {
					list2.add(nodearr2[i]);//[, , , , , , , ]
				} else {
					list2.add("");
				}
			}
		}
		if (existArr.size() > 0) {
			// 再筛选出各自的拆分级别
			if (cffs.equals("0")) {
				for( int i=0;i<existArr.size();i++){
					if(i<(existArr.size()/2)){
						gjcfarr.add((Maxgjcf+i)+"");
					}else{
						gjcfarr.add(gjcfarr.get((i-(existArr.size()/2))));
					}
				}
			}
			// 自动拆分处理
			if (cffs.equals("1")) {
				List<String> lbList = new ArrayList<>();
				// 记录总学校的个数(添加了几个非同级)
				int zxx = 0;
				for (int i = 0; i < existArr.size(); i++) {
					if (existArr.get(0).split("-")[1].equals(existArr.get(i).split("-")[1])) {
						zxx++;
					}
					lbList.add(existArr.get(i).split("-")[1]);
				}
				// 学校中的收入和支出是一一对应的, 记录一个学校中的gjcf
				List<String> oneInfo = new ArrayList<>();
				for (int i = 0; i < zxx / 2; i++) {
					oneInfo.add((Maxgjcf+i)+"");
				}
				oneInfo.addAll(oneInfo);
				LinkedHashSet<String> hashSet = new LinkedHashSet<>(lbList);
				// 有几种学校(415 413 411 61)
				List<String> withOutList = new ArrayList<>(hashSet);
				for (int i = 0; i < withOutList.size(); i++) {
					gjcfarr.addAll(oneInfo);
				}
			}
			// 手动拆分处理
			if (cffs.equals("2")) {
				// 每个学校最大值的构建拆分需要单独去查
				String lb = existArr.get(0).split("-")[1];//学校类别代码
				int zxyCount = 0;
				// 处理总学校构建拆分值
				if ("412".equals(lb) || "414".equals(lb) || "415".equals(lb)) {
					int newAddGjcf = this.getExistj2FbMax(jyjfj2_2f.getDWDM(), lb, jyjfj2_2f.getZtid());//该类别附表的最大拆分数
					if(0 == newAddGjcf){
						newAddGjcf = 2;
					}else{
						newAddGjcf = newAddGjcf + 1;
					}
					for (int i = 0; i < existArr.size(); i++) {
						if (lb.equals(existArr.get(i).split("-")[1])) {
							zxyCount++;//完全中学中总校(新增)附表数量
						}
					}
					for (int i = 0; i < zxyCount / 2; i++) {//支出表,收入表赋值是一样的,相当于要赋的值差分值数量只有表数量的一半
						gjcfarr.add(newAddGjcf+"");//[3, 4]
						newAddGjcf++;
					}
					gjcfarr.addAll(gjcfarr);//[3, 4, 3, 4]
				}
				// 处理子学校构建拆分值
				List<String> lbList = new ArrayList<>();
				for (int i = 0; i < existArr.size(); i++) {
					String zlb = existArr.get(i).split("-")[1];
					if (!"412".equals(zlb) && !"414".equals(zlb) && !"415".equals(zlb)) {//所有数值中剔除掉属于这几类的
						lbList.add(zlb);//[411, 411, 413, 413]
					}
				}
				LinkedHashSet<String> hashSet = new LinkedHashSet<>(lbList);//去除重复[411, 413]
				List<String> withOutList = new ArrayList<>(hashSet);//[411, 413]
				for (String zxxlb : withOutList) {//逐类别遍历如411
					List<String> zxxList = new ArrayList<>();
					// 处理每个子学校
					int newAddGjcf = this.getExistj2FbMax(jyjfj2_2f.getDWDM(), zxxlb, jyjfj2_2f.getZtid());//下属学校该类别的的最大拆分数
					if(0 == newAddGjcf){
						newAddGjcf = 2;
					}else{
						newAddGjcf = newAddGjcf + 1;
					}
					int zxxCount = 0;
					for (int i = 0; i < lbList.size(); i++) {
						if (lbList.get(i).equals(zxxlb)) {
							zxxCount++;//遍历到的类别在下属学校中总数
						}
					}
					for (int i = 0; i < zxxCount / 2; i++) {
						zxxList.add(newAddGjcf+"");
						newAddGjcf++;
					}
					zxxList.addAll(zxxList);
					gjcfarr.addAll(zxxList);//所有的拆分值都计算完毕依次添加,最终:[3, 4, 3, 4, 3, 3, 2, 2]
				}
			}
		}
		//在筛选出各自的
		//先去查询一个List 查询本地区已有的数据
		//进行判断如果是当前表的数据就进行更新,如果是进行
		//遍历这个数组,进行返回不存在的节点,然后准备插入 还得剔除当前这个节点的数据
		 String  xzgjcf="";
		 String removeGjcf = "";
		 
		 for( int i=0;i<existArr.size();i++){
	    	if(id.equals(existArr.get(i))){//把点击保存的当前表单独剔除
	    		xzgjcf=gjcfarr.get(i);     //获得当前表的拆分值
	    		// 2021.10.14 移除的这个元素要保存,批量操作会有Bug
	    		removeGjcf = gjcfarr.get(i);    //同上
	    		gjcfarr.remove(i); //将该值移除数组
	    	}
		 }
		 existArr.remove(id);//长数组也移除
		 jyjfj2_2f.setGJCF(xzgjcf+"");//设置当前表的拆分值
		 
		 this.doDeleteNodeList(nodestr,jyjfj2_2f.getDWDM(),existList);//删除非统计表格方法
		//通过
		// 这个List取新生成需要的List
	    //新写一个方法,然后多余添加的就去这个新写的方法去添加
	    if(existArr.size()>0){
	    	JYJF_J2_3F jyjf_J2_3F = new JYJF_J2_3F ();
	    	jyjf_J2_3F.setBZSM(Validate.isNullToDefaultString(jyjfj2_2f.getBZSM(), ""));
	    	jyjf_J2_3F.setGJCF(jyjfj2_2f.getGJCF());//4334行,上面
	    	jyjf_J2_3F.setLSGXDM(jyjfj2_2f.getLSGXDM());
	    	//插入除本表外其他非同级表拆分值数组是移除后的
	    	this.doUpdateTbxxFeitongji(Maxgjcf,jyjfj2_2f,jyjf_J2_3F,existArr,list2, jyjfj2_2f.getFZR(), jyjfj2_2f.getTBR(), jyjfj2_2f.getLXFS(), jyjfj2_2f.getTBRQ(), jyjfj2_2f.getDWDM(), jyjfj2_2f.getXXLBDM(), jyjfj2_2f.getDQDM(), "1", "0", "", cffs, "",gjcfarr);
	    }
	    // 重新将移除的构建拆分值赋给实体类
	    jyjfj2_2f.setGJCF(removeGjcf);//多余4327行

@Scheduled 是 Spring Framework 提供的一种用于调度方法执行的注解。通过使用 @Scheduled 注解,可以在应用程序中定期或延迟地运行方法。

使用 @Scheduled 注解需要遵循以下步骤:

在要调度的方法上添加 @Scheduled 注解。
指定调度的规则,包括调度频率、起始时间、结束时间等。
将调度的任务注册到 Spring 容器中。
以下是一个使用 @Scheduled 注解的示例:

@Component
public class MyScheduledTask {
    
    // 每隔一分钟执行一次
    @Scheduled(fixedRate = 60000)
    public void myTask() {
        // 执行定时任务的业务逻辑
    }
}
在上述示例中,我们使用 @Scheduled 注解标记了 myTask 方法,该方法会每隔 60 秒执行一次。

除了 fixedRate 外,@Scheduled 注解还支持其他调度规则,如 cron 表达式、指定时间间隔等。可以根据具体的业务需求来选择合适的调度规则。

需要注意的是,使用 @Scheduled 注解需要在 Spring 应用程序上下文中启用任务调度支持,可以通过在 Spring 配置文件中添加 <task:annotation-driven /> 来实现。

SELECT FORMULAID, COUNT(1)
  FROM JYJF_VALIDTIP_2022
 WHERE DQDM LIKE '2308%'
   AND DYOPTION = 2
 GROUP BY FORMULAID
 ORDER BY FORMULAID
 
 
-- DELETE  FROM  JYJF_VALIDTIP_2022 WHERE DQDM LIKE '2308%' AND DYOPTION = 2
 
 SELECT * FROM JYJF_VALIDTIP_2022 WHERE dqdm LIKE'2308%'
 
 select * from JYJF_SQL_ZDYGS_2022 t where  DQDM LIKE '2308%'
java 字符串String与整数int类型相互转换
int number = 123;
String strNumber = String.valueOf(number);

int number = 123;
String strNumber = Integer.toString(number);

int number = 123;
String strNumber = "" + number;
-------------------
String str = "123";
int num = Integer.parseInt(str);

加班情况表连接

https://docs.qq.com/sheet/DSW9zWEZmQnFabWd3?tab=BB08J2&_t=1657779453186

104删除保存108添加保存

在要被删除的表附表页面删除,然后点击保存。然后新增,然后还是停在这个页面。

因为筛选不出新增的所以共建拆分设置为空。

还有可能,刚添加完,点进这个刚添加的页面,未保存,删除

对不起来的情况,先将当前这个页面编辑一下非同级拆分,然后在当前页面添加一个地区靠前的拆分,仍然在当前页面点击保存

j2_2f只要在当前的表不动,绝对稳定触发

var firstnode = root.firstChild; //隐藏的根节点的第一个节点
		var firstChild = firstnode.firstChild;//人员情况表
		var nextSibling = firstChild.nextSibling;//收入表
	  //var url = nextSibling.attributes.href;//收入表的连接

root 是树节点,left是整个树面板。

dao getValidatelist service有8個地方使用。(改好了只需要看方法少的方法)
前台的sh方法太多,测试(type = 3退回已测试4提交已测试)

方法太多所以service与dao名字不同非常重要。
起名不规范。
黄色警告太多
空行太多
if("j2_2".equals(jbdm)) {
        	mv.addObject("idstartwith", "ftjcfsrb-");
        }else {
        	mv.addObject("idstartwith", "ftjcfzcb-");
        }
选择汇总 z4b系列,位置要改。
java定时器@Scheduled() ,我需要每个季度第一天,一月一日,四月一日,七月一日,十月一日自动执行代码,应该如何配置。

季报月报定时器

定时器:

eval() 函数计算或执行参数
如果参数是表达式,则 eval() 计算表达式。如果参数是一个或多个 JavaScript 语句,则 eval() 执行这些语句。

注释写的规范也是非常重要的:

/**
 * 执行传入的语句并返回布尔值,代码会将所有传过来的变量转换成BigDecimal进行计算,
 * 但是有一些额外的参数比如{@code lxgxdm, dqdm}等参数作为字符串进行计算
 *
 * @param exp        需要执行的语句
 * @param parameters 语句中的变量值
 */
这段代码定义了一个名为getJep()的静态方法,返回一个Jep对象。Jep是一个Java数学表达式解析器,它允许您将字符串解析为数学表达式,并计算表达式的值。该方法通过使用addFunction()方法向Jep对象添加两个自定义函数,这些函数将在表达式求值期间被调用。

第一个自定义函数名为"subs",它接受三个参数。第一个参数是一个字符串,表示待处理的字符串,第二个参数是一个整数,表示截取子字符串的起始位置,第三个参数是一个整数,表示截取子字符串的长度。该函数返回截取后的子字符串或者-1,如果参数不符合要求或者发生了异常,则返回-1。

第二个自定义函数名为"compare",它接受至少两个参数。第一个参数是一个字符串,表示要进行比较的字符串。后续参数是与第一个参数进行比较的其他字符串。该函数返回1或者0,如果第一个参数在后续参数中出现,则返回1,否则返回0。

在Jep对象被创建后,该方法返回该对象,可以在程序的其他部分使用该对象来解析数学表达式或调用自定义函数。

警告:前台想处理对象或者数组,必须设定dataType为json.否则数据类型将会是字符串。

您可以使用dataType属性来设置接收的数据类型。如果您想要接收一个数组,可以将dataType设置为json,这样就可以直接接收一个数组了。例如:

$.ajax({
    url: 'your_url',
    dataType: 'json',
    success: function(data) {
        console.log(data);
    }
});
如果您想要接收一个字符串,可以将dataType设置为text,这样就可以直接接收一个字符串了。例如:

$.ajax({
    url: 'your_url',
    dataType: 'text',
    success: function(data) {
        console.log(data);
    }
}); 
数据上报时 insert select语句:
insert into  jyjf_jtable_data_state_2022
select k.xxdm ,'0',k.dqdm,'73','0','','0','','','','','','7.0.2.10','4D0DB043C24A48D3A181D880655C55BD','','',''

外网密码jyjf@135

上报时基表改动或分析表生成未校验,修改appvar表

更新部署在tomcat中的程序时,将jar中的com文件夹直接替换到 web——inf classes 中的com 文件
整个文件夹直接拖进去会提示,直接替换即可。
在菜单中添加,代码管理,导出代码。
指定导出中的单个学校。
导出压缩包没有外面的指定导出,只有一层压缩包。
#代码包导出在gloobal.properties中:
#检测到有改动五秒自动执行一次
FileRegionPath=D:\\JYJF\\region\\
FileRegioNonLevelNPath=D:\\JYJF\\regiononlevelnpath\\
FileSchoolPath=D:\\JYJF\\school\\
FileSchoolXianPath=D:\\JYJF\\schoolxian\\
#临时文件夹,将上面四个文件夹中指定地区或学校copy到临时文件夹中,打包。
FileZipPath=D:\\JYJF\\zip\\
FileZipTempPath=D:\\JYJF\\ziptemp\\
#压缩包密码
FileZipPasswd=123456
FileDataZipPasswd=founderjyjf
403错误是xss拦截
xssFilterz中 doFilter方法

数据管理的校验数据导出,数据管理是判断下属地区有无上报,这个就要判断选中的地区有无上报。

下发单位,上年账套与上年分析表不需要.
style="display:none;"
 $('#hideButton').css('visibility','hidden');
  $('#showButton').css('visibility','visible');
<div>
    <!--display: none 隐藏按钮-->
    <button type="button" style="display: none" >隐藏</button>
    <!--display: block 显示按钮-->
    <button type="button" style="display: block">显示</button>
</div>
<!--第二种方法-->
<div>
    <!--visibility: hidden 隐藏按钮-->
    <button type="button" style="visibility: hidden" >隐藏</button>
    <!--visibility: visible 显示按钮-->
    <button type="button" style="visibility: visible">显示</button>
 new RowCallbackHandler()

 @Override
    public String call(){
        try {
        	db.queryAndWriteFile(sql, values, atomicInteger, fullPath, table, MaxXmlCount, lastYearTables, xmlname);
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("线程内异常 mainThreadLatch.countDown();");
            return "error";
        }
    }
    
    CompletionService<String> completionService = new ExecutorCompletionService<String>(taskExecutor);
    private ThreadPoolTaskExecutor taskExecutor;
    
    completionService.submit(new SaveSingleQueryTableAsFileThread(tableNameAndIdIncre.get(table.toLowerCase()),sql,values,fullPath, table, lastYearTable, xmlname));
    SaveSingleQueryTableAsFileThread类继承callable 有个覆盖call方法,执行任务,执行成功返回true ,失败false 
    completionService.take().get();
    --WebSocketSession.sendMessage
从每个表中搜索按下属地区搜索,创建sql插入语句与xml文件
932行,不断循环,最最终导完数据包
分析报告清理除了当前用到的。基表叠加学校类别点击行无法多选,点击前面可多选,学校类别,选择完全中学九年制学校。
--
自定义公式查询,添加已退回按钮,包自定义公式页面申请状态要有已退回。

1805行获取的山东省与16市 然后17个地区连续遍历
每个地区都包括了本级条件
每个地区
如果是要导出地区,就用 and
SELECT *  FROM JYJF_J1_1_2022 WHERE 1=1  AND (DQDM = '37' OR DQDM = '370000000')  AND ZTID = ? }
如果是导出地区下属地区,直接like SELECT *  FROM JYJF_J1_1_2022 WHERE 1=1  AND DQDM LIKE '3701%' AND ZTID = ? 
分析报告:SELECT WJID,DQDM,WJMC,WJLX,WJDX,URL FROM JYJF_REPORT_2022  WHERE DQDM LIKE CONCAT('37','%') AND ZTID = '4D0DB043C24A48D3A181D880655C55BD';
分析表校验数据:
SELECT  FXBDM as "FXBDM",FXBZB as "FXBZB",DQDM as "DQDM",DQMC as "DQMC",lastNum as "lastNum",currentNum as "currentNum",ZENGJIAN as "ZENGJIAN",TJZJ as "TJZJ",changType as "changType",changReason as "changReason",changExplain as "changExplain",xuhao as "xuhao",isExplain as "isExplain",lsjbdm as "lsjbdm",FXBName as "FXBName",TableNameEx as "TableNameEx",isValid as "isValid",sort as "sort"  FROM JYJF_FXBVALIDTIP_2022 WHERE DQDM LIKE CONCAT('37','%') AND ZTID='4D0DB043C24A48D3A181D880655C55BD';
将这所有的数据也写成xml与sql
压缩以上生成内容到ziptemp1\data.zip
生成数据包时,分学校用户了 与userType字段有关(这个只是起个包名)
生成数据包生成代码包时,也分了学校用户:isSchoolUser字段来判断
exportCode
如果是地区exportCode :SELECT    FROM JYJF_REGION_2022 WHERE CODE LIKE CONCAT('37','%') and ztid = '4D0DB043C24A48D3A181D880655C55BD'   ORDER BY LEVELS ;

--可以看到查询了省市县乡镇所有地区。 所有地区数据创建regioninfo xml文件
紧接着1482查询了所有学校,这个,完全需要自己写。schools = schoolDao.getAllSchoolByDqdm(dqdm,startRownum,endRownum,is65has6553);
要限制未校验的地区。
--紧接着,非同级地区文件,也是like全部地区

检查最后将ziptemp1清空,生成的数据包压缩包解压到ziptemp1中			
远程
SVN远程

[] {LUser.getDqZtid()},String.class);
这种方法,jdbctemplate原生支持,使得方法不用再返回LIst<Map<String,Object>>
返回List<String>
ztid+File.separator+newFileName
分析报告固定既存路径又将内容存blob存到数据库。
将文件用流的方式存到数据库,看分析报告存储方法。
在往数据库中存储前,先查该帐套该地区分析报告,如果有
如果能查到
File folder = new File("path/to/folder");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
    if (file.isFile()) {
        String fileName = file.getName();
        // Check if the file name is not in the database
        if (!isFileNameInDatabase(fileName)) {
            // Delete the file
            file.delete();
        }
    }
}
This code will delete all files in the specified folder whose names are not found in the database. If you want to delete directories recursively including starting directory, you can use this one-liner solution (Java8):
try (var dirStream = Files.walk(Paths.get("path/to/folder"))) {
    dirStream.map(Path::toFile)
             .sorted(Comparator.reverseOrder())
             .forEach(File::delete);
}

列表:数字居右,文字居左,日期在中间。

禅道
用户名 lisongpeng
禅道密码是自己姓名的首字母  +@123   如:lsp@123
自定义公式状态:未生成:0已生成:1校验通过:2不通过:3上报:4确认:5全国生成:6全国校验通过:2
全国退回:3

生成后无法下发 校验成功的公式可以下发  
加了 退回 校验 上报 自定义公式查询,添加已退回按钮,包自定义公式页面申请状态要有已退回。

自定义公式所有状态 流程:全国只有查询页面,自定义公式页面省市县都有,
假设一个县:导入公式后,先生成 生成 未上报的绝对不能生成 生成后 校验
校验未通过的可以点击上报(为了宽容度,校验通过也可上报了。), 校验通过就可以下发了,下发检查必须要校验通过。

上报上去的 在自定义公式查询中,确认 生成 校验 
全国校验通过 下级自动看到 可下发
Map<String,Object> filemap =  fxbgService.getfileMap(dwbh);
		String fileUrl = realPath+filemap.get("url")+"";
		String filename = filemap.get("wjmc")+"";
 E:/eclipse-jee-juno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp4/wtpwebapps/JYJF/
 E:/eclipse-jee-juno/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/JYJF/file/866923BFC2704310BA473B98F2626FBC/丰台区2022年教育经费统计分析报告2023.2.27.docx
命令行导表
导入,每次导入必须指定log
C:\Users\Administrator>imp jyjf/jyjf@192.168.11.189/shitan file=C:\Users\Administrator\Desktop\BC8CB6F3F5AA48D4832E37F543D4BD3D\databak\jyjfjb20230507.dmp  tables=(JYJF_FXBVALIDTIP_2022)  log=D:\2023table.log
C:\Users\Administrator>exp jyjf/jyjf@192.168.11.189/shitan file=D:/0517fxbval.dmp  tables=(JYJF_FXBVALIDTIP_2022)

只要看到导入XXX行就是成功了。

exp USER/PASS@DATABASE FILE=’D:\table.dmp’ TABLES=TAB%
导出特定表:
exp jyjf/jyjf@192.168.11.174/shitan file=D:/2023table.dmp  tables=%2023%

exp jyjf/jyjf@192.168.11.174/shitan file=D:/1111.dmp  tables=(JYJF_CHANGEDQDM_2023)

C:\Users\Administrator>imp jyjf/jyjf@192.168.11.234/shitan file=D:\2023table.dmp

经由常规路径由 EXPORT:V11.02.00 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
IMP-00031: 必须指定 FULL=Y 或提供 FROMUSER/TOUSER 或 TABLES 参数
IMP-00000: 未成功终止导入
指定full=y:

C:\Users\Administrator>imp jyjf/jyjf@192.168.11.234/shitan file=D:\2023table.dmp full=y log=D:\2023table.log

exp username/password@ip地址/实例 file=路径及文件名 tables=%2023% not like ‘jb%’ and not like ‘yb%’

-----------
exp jyjf/jyjf@192.168.11.234/shitan file=D:/JYJF_exp1031.dmp  tables=JYJF%2023 log=D:\JYJF_exp1031.log

exp jyjf/jyjf@192.168.11.234/shitan file=D:/HIS_exp1031.dmp  tables=HIS%2023 log=D:\HIS_exp1031.log

exp jyjf/jyjf@192.168.11.234/shitan file=D:/SJJS_exp1031.dmp  tables=SJJS%2023 log=D:\SJJS_exp1031.log

exp jyjf/jyjf@192.168.11.234/shitan file=D:/TEMP_exp1031.dmp  tables=TEMP%2023 log=D:\TEMP_exp1031.log

exp jyjf/jyjf@192.168.11.174/shitan file=D:/f110226.dmp  tables=%F11%2023 log=D:\f110226.log 

exp jyjf/jyjf@192.168.11.174/shitan file=D:/f110226.dmp  tables=%z16%2023 
 log=D:\f110226.log  rows = n
 
imp jyjf/jyjf@192.168.11.234/shitan file=D:/f110226.dmp  full=y   buffer=40960000

imp cwsjglpt/cwsjglpt@192.168.11.174/shitan file=D:/f110226.dmp  full=y   buffer=40960000


----------- 由于导出temp开头的表时,看日志发现少了表,甚至导出HIS开头表,日志直接显示没有这个表
所以,导出任何表都要运行一遍这两个语句。 语句1运行第二列Analyze开头的语句。
select 'select * from '||table_name||';','Analyze table '||table_name||' compute statistics;',t.TABLE_NAME,t.NUM_ROWS,t.*  from user_tables t  where table_name like'JYJF%2023'  ; 

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 and table_name like'JYJF%2023'

exp jyjf/jyjf@192.168.11.174/shitan file=D:/exp_imp/region_school0329.dmp  tables=(JYJF_REGION_2023,JYJF_SCHOOL_2023)  log=D:\exp_imp\region_school0329.log  BUFFER = 4096000


--where条件
exp jyjf/jyjf123456@172.18.15.200:1521/jyjfdb file=C:\Users\Administrator\Desktop\更新文件\2023-12-12\expDM1212.dmp tables=(jyjf_school_2022,jyjf_region_2022,jyjf_subjection_2022,jyjf_schoolcategory_2022,jyjf_CUSTOMCLASSIFY_2022) log=C:\Users\Administrator\Desktop\更新文件\2023-12-12\TEMP_imp1212.log buffer=40960000 query =\"where ztid ='BCCB8A50D5A8416F867A70129F5A093A'\"

oracle数据泵

必须在安装数据库实例的机器上使用。其他机器连接到该机器无效。

CREATE DIRECTORY myDir3 AS 'F:\oracl-backup'
GRANT READ, WRITE ON DIRECTORY myDir3 TO JYJF
SELECT * FROM DBA_DIRECTORIES t WHERE DIRECTORY_NAME = 'F:\oracl-backup';
EXPDP jyjf/jyjf@192.168.11.174/shitan DIRECTORY=myDir3 DUMPFILE=Schools.dmp TABLES=JYJF_SCHOOLS_2023 

点分析表校验时,全国校验新疆不再包含兵团,用新疆的那套数据,不再用全国特有的数据

县全部地区下发的是镇还是学校。

收付实现制到处Excel 修改。全国 加新疆。

select gid as ybid,year as ybnf,month as ybyf from (select * from YB_YFB t  where sfdq = '1'  order by to_number(year) desc,to_number(month) desc) where rownum = 1 and 

put是有返回值的,当前的key存储过,就返回上一个存储的值,没存储过,返回null
map.values
Collection<V> values();  
 List有序 可重复
 HashSet 无序LinkedSet加入时顺序 Treeset 加入时按Hashcode自动排序。
 所有set均不可重复。
 所有的Map key不可重复。
 HashMap 遍历顺序和hashCode一致,LinkedHashMap和加入顺序一致(自动填充例子),TreeMap,基于key自动排序。
swagger、apipost、apifox、yapi、eolink 

linux命令
linux命令 
WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。
进入bin目录
查看tomcat是否启动: ps -ef |grep  tomcat
关闭tomcat: ./shutdown.sh start
./startup.sh start
启动redis 进入bin目录中输入 ./redis-server
关闭: ./redis-cli shutdown
ctrl c 关闭当前任务,可输入命令
打印模板说明 框高240。
ReportClientDocument  ISubreportClientDocument
 var yearlist = JSON.parse('[{"NF":"2022"},{"NF":"2021"},{"NF":"2020"},{"NF":"2019"}]');
    for (var i = 0; i < yearlist.length; i++) {
        yearlist[i].text = yearlist[i].NF;
    }
var yearlist = JSON.parse('[{NF=2022}, {NF=2021}, {NF=2020}, {NF=2019}]');
    for (var i = 0; i < yearlist.length; i++) {
        yearlist[i].text = yearlist[i].NF;
    }
    // href="/detail/{{=d.field}}"
    
     <a  class="layui-table-link hre-sjfx">{{=d.SJFX}}</a>

{field: 'hide',title: '数据分析',   colspan: '1', rowspan: '1', align:'center'},
head2.push({field: 'SJFX',title: '12', colspan: '1',align:'center',templet: '#titleTpl'});
分析表校验 未填写说明
fxbvalidtip
tjzj字段
无学校地区 
J345有数据也要在树上显示出来
分析表与过录表点击全部数据 也要显示
基表树getRootQhTree
getNextModelsshb
新建月报地区数据
MERGE INTO yb_REGION_2023 trg USING (SELECT code, levels,ID FROM yb_REGION_2022 WHERE ztid = '1DA7830D09CC41FF9A6D18F095AC7B63') src ON (trg.code = src.code AND trg.id = src.id) WHEN MATCHED THEN UPDATE SET trg.levels = src.levels;
--
DELETE FROM  yb_REGION_2023 WHERE ztid = '017E4F8F013A42ED8D1BA58B3B02FE01' AND CODE IN(
SELECT CODE FROM JB_REGION_2022 WHERE ztid = '58C61BCCB6EB4CF398FF798C13168F6B' AND CODE NOT IN(SELECT CODE  FROM  YB_REGION_2022 WHERE ztid = '1DA7830D09CC41FF9A6D18F095AC7B63' ))
--
INSERT INTO yb_REGION_2023 SELECT ID,NAME,CODE,parentid,LEVELS,createtime,'2023' AS nf,'017E4F8F013A42ED8D1BA58B3B02FE01' AS ztid,SFJH,SFZG FROM YB_REGION_2022  WHERE ztid = '1DA7830D09CC41FF9A6D18F095AC7B63' AND CODE NOT IN( SELECT CODE FROM  JB_REGION_2022 WHERE ztid = '58C61BCCB6EB4CF398FF798C13168F6B')
        String sql = "  MERGE INTO ZCPHQKB z USING ( "
                + "SELECT ? AS xxgid,? AS qdm,? AS u1,? AS u5 FROM DUAL) k ON (z.qdm=k.qdm AND z.xxgid=k.xxgid) WHEN MATCHED THEN "
                + "UPDATE "
                + "SET z.u1=k.u1,z.u5=k.u5 WHEN NOT MATCHED THEN "
                + "INSERT (guid,xxgid,qdm,u1,u5) VALUES (sys_guid(),?,?,?,?)";
            return  db.update(sql, objects)>0? true:false;
            
            return  db.update(sql, objects)>0? true:false;
这段代码的作用是计算两个BigDecimal数值的同比增长率,用到的方法有:
subtract方法,用于两个BigDecimal数值相减,返回一个新的BigDecimal数值
divide方法,用于两个BigDecimal数值相除,返回一个新的BigDecimal数值,可以指定除法的精度和舍入模式
multiply方法,用于两个BigDecimal数值相乘,返回一个新的BigDecimal数值
setScale方法,用于设置BigDecimal数值的小数位数和舍入模式,返回一个新的BigDecimal数值
RoundingMode枚举类,用于指定舍入模式,例如HALF_UP表示四舍五入
(四)f1x3
    	//今年经费总投入
//    	String thisYearSql = "SELECT SUM(NUM) FROM( "+ " SELECT "+ "z01 "+ "AS NUM FROM "+getFullTableName("z1")+" WHERE dqdm = ? AND ztid= ? AND LEVELNUM IS NOT NULL AND RYBH IS NULL AND DWDM IS NULL AND "
//    					+ "xuhao = '01' "+ " UNION ALL select to_number(nvl(z00,0)) AS NUM  from "+getFullTableName("appvar")+" where ROOTDEDM='00' AND ZTID = ? )";

    	//去年经费总投入
//    	String lastYearSql = "SELECT SUM(NUM) FROM( "+ " SELECT "+ "z01 "+ "AS NUM FROM "+getFullTableName("z1",lastYear)+" WHERE dqdm = ? AND ztid= ? AND LEVELNUM IS NOT NULL AND RYBH IS NULL AND DWDM IS NULL AND "
//    	+ "xuhao = '01' "+ " UNION ALL select to_number(nvl(z00,0)) AS NUM  from "+getFullTableName("appvar",lastYear)+" where ROOTDEDM='00' AND ZTID = ? )";
    	//String thisYearValue = db.queryForSingleValue(thisYearSql, new Object[] {dqdm,ztid,ztid});
    	//String lastYearValue = db.queryForSingleValue(lastYearSql, new Object[] {dqdm,lastYearZtid,lastYearZtid});
if("1".equals(j2Dao.getisdqzt(LUser.getDqZtid()))) { 
        	LastsrbMap = this.getLastYearData("j2_1", pd);
}else {
        	LastsrbMap = new HashMap<String, Object>();
}

综表连接 联结 所有条件

----------
z.ZTID=K.ZTID AND z.DQDM=K.DQDM AND NVL (z.DWDM,'-99')=NVL (K.DWDM,'-99') AND z.LSJBDM=K.LSJBDM AND z.XUHAO=K.XUHAO AND z.levelnum=K.levelnum AND NVL(z.RYBH, '-99') = NVL(K.RYBH, '-99') 
年报 没有县本级,因为是镇/街道,只有他们下的学校。

报表生成 人员编号单独生成 是为管理权限用户使用的。

管理权限用户是街道,所以不给他和县一样的数据,只给他有权限的一部分,

但是因为只看地区代码就是县,所以加人员编号单独一套。

getFullTableName\(\"([\w]+)\"\)

getFullTableName\(\"$1\"\,year\)

---
这个参考
getFullTableName\(\"([\w]+)\"\, year\)
getFullTableName\(\"$1\"\)
根据我搜索的结果,datatable给某列设置width无效,可能有以下几种原因:

datatable的自动宽度属性bAutoWidth设置为true,导致列宽度根据内容自动调整,忽略了手动设置的值。解决方法是将bAutoWidth设置为false,然后再给列设置width1。
datatable的列宽度受到表格本身的样式影响,比如td的margin或padding等。解决方法是检查表格的样式,并尝试调整或去掉不必要的样式2。
datatable的列宽度设置为百分比或其他相对单位,导致列宽度随着表格或窗口大小变化而变化。解决方法是使用固定的单位,比如px2。
datatable的列宽度设置不正确,比如使用了错误的语法或参数。解决方法是检查列宽度的设置是否符合datatable的文档3。
----
在table元素上添加style=“white-space: nowrap;”,表示文本不换行,然后在datatable的初始化选项中设置"scrollX": true,表示开启水平滚动条1。
在datatable的初始化选项中设置"autoWidth": false,表示关闭自动宽度调整,然后在columns或columnDefs选项中设置每列的宽度2。
在CSS样式中覆盖dataTables_wrapper的overflow-x属性为auto,表示当内容超出宽度时出现滚动条,然后在table元素上设置固定的宽度3。
资金监管获取区代码:
String qdm = LUser.getDwbh();
		String dwjc = Validate.isNullToDefaultString(LUser.getDwjc(), "4");
		if("4".equals(dwjc)) {
			qdm = dictService.getXxqdm(qdm);
		 }
		String sjqdm = dictService.getSjQdm(qdm);

调用父页面的父页面的方法:

var url = window.parent.parent.delNodeAction(id,dwdm,zxxcfxxlb,cflx,sfwqxx,xxlbstr,xxlbdm);
if(url){//删除完页面跳转。
window.parent.location.href = url;
}

websocket

ThreadPoolTaskExecutor

TextWebSocketHandler

CountDownLatch

AtomicBoolean

PlatformTransactionManager

Callable 与call future类型。

学校用户 自定义公式 在基表文件夹中 xxjygs_list

Spider 与Geccoengine都是线程,交叉调用:Spider spider = new Spider(this);
engine中初始化spider,但是把自己(this)作为构造spider的参数,engine本身是spider中的一个实例字段。只是在run中把spider初始化并调用
学校

校验并保存有提示性信息(非强制)就是不通过。

双击校验信息定位到问题数据,这时点击切换校验信息按钮,是切换定位问题数据单元格。

基表一旦保存 appvar表就会更新

请注意,学校不通过,状态是-1("/jbjy/doAddWtgOrBdyyWQZ" 校验并保存先走临时保存,成功后校验详见jyjfshenhe.js:doJyShenhe())。 这时学校不能上报,导出只能选择不校验导出。

仅有提示性信息,填写说明后,需要重新校验,才通过。

删除非同级表,需临时保存,才有效。

非同级拆分

相同地区 相同部门 不可重复添加

共建拆分 gjcf字段 只有附表这个字段有用。j2-2 j2-3不会变。

每一对从2开始,增加新增的一对附表数值变为3 依次+1

基表主表 ztid dwdm zxxcflb确定三条数据:

自动拆分 手动拆分 校验并保存时才会走。

一旦县修改了 学校的基表,该县 appvar立刻变为基表改动状态。

且县修改的学校状态为 4(doUpdateTbxx)

临时保存学校: 学校用户状态 1 省市县4 全国 74

临时保存 无论哪个用户点击临时保存,都将当前用户appvar 变为1 基表改动。

上报时,有数据校验未通过,上报时会弹窗显示未通过单位,如果将数据改正确,需要再点击校验,这时这些单位状态改变。上报时不会再弹窗。

一旦集中校验,appvar就是基表改动状态。

上报

分析表未填写说明 三个条件:

JYJF_FXBVALIDTIP_2023 tjzj 同级增减字段 不在 1,4结果中  
​
变化原因changreason  和 isexplain字段  填写原因,同级增减会是1
分析表校验信息说明,确认唯一一条数据:
FTEMP.FXBDM = F.FXBDM AND FTEMP.DQDM = F.DQDM AND FTEMP.XUHAO = F.XUHAO AND AND FTEMP.ZTID = F.ZTID
SELECT dqdm,FXBDM,XUHAO,CHANGTYPE,ZTID FROM jyjf_fxbvalidtip_2023 WHERE dqdm = '360102' GROUP BY dqdm,FXBDM,XUHAO,CHANGTYPE,ZTID HAVING COUNT(*)>1

基表变动原因 bhyyb表校验, 分析表 fxbjy_

https://www.zhihu.com/question/589878836

开启J345填报 J345只有校验并保存 ,不走集中校验就能上报。

优化:

数据上报修改提示。

自定义公式 校验通过 与校验不通过 23状态互换

加生成人地区代码 已校验的,查生成人。

上报改成申请 撤销商报改成撤销申请

季报月报24年

J1-1保存添加验证,验证年初年末折合学生数。

前台已经算好的数,保存时再算一遍。

过录表导出无序号。

数据接收改地区表version 还需修改 global.properties文件中的version配置为 DAtaTransferInfo.xml文件中的版本

net.lingala.zip4j  经费java压缩包类 所在的包

/**
 * ZIP压缩文件操作工具类 支持密码 依赖zip4j开源项目(http://www.lingala.net/zip4j/) 版本1.3.1
 * 
 * @author ninemax
 */
public class CompressUtil {
重启ngnix

学校属性对比

select count(*)
from (select * from jyjf_school_2023 where ztid = '2B815BD4944C4D0C8FCAC07DF5050867')s1 
join (select * from jyjf_school_2022 where ztid='BCCB8A50D5A8416F867A70129F5A093A')s2
on s1.code = s2.code
where (s1.dqdm = s2.dqdm and s1.CATEGORYID =s2.CATEGORYID and s1.SUBJECTIONID=s2.SUBJECTIONID 
 and s1.citycategory=s2.citycategory and nvl(s1.pratt,'1')=nvl(s2.pratt,'1')  and nvl(s1.nation,'2')=nvl(s2.nation,'2')) and  s1.lndb = '1'
select s1.code,s2.code,s1.name,s2.name,s1.dqdm,s2.dqdm,s1.pratt,s2.pratt,s1.nation,s2.nation,s1.citycategory,s2.citycategory,s1.categoryid,s2.categoryid,s1.subjectionid,s2.subjectionid 
from (select * from jyjf_school_2023 where ztid = '2B815BD4944C4D0C8FCAC07DF5050867')s1 
join (select * from jyjf_school_2022 where ztid='BCCB8A50D5A8416F867A70129F5A093A')s2
on s1.code = s2.code
where s1.dqdm != s2.dqdm or s1.CATEGORYID !=s2.CATEGORYID or s1.SUBJECTIONID!=s2.SUBJECTIONID 
 or s1.citycategory<>s2.citycategory or nvl(s1.pratt,'1')<>nvl(s2.pratt,'1')  or nvl(s1.nation,'2')<>nvl(s2.nation,'2') 
$(document).on("click", ".select-all", function(){
		if($(this).prop("checked")){
			$("checkbox").prop("checked", true);
		}else{
			$("checkbox").prop("checked", false);
		}
	});
String gid = pd.getString("gid");
        String[] params = gid.split(",");
        String cxsm = Validate.isNullToDefaultString(pd.get("cxsm"), "");
        objs.add(new Object[]{cxsm,gid.split(",")});

Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String currentDate = sdf.format(date);

学校名称查询,

项目名称,学校名称 资金 退回按钮.

用时间 或者做关联.

新增时上次保存前的查不出

点击编辑时 上次与本次区间

据实结算退回列表开发,办学条件改造方式表默认只查薄改数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值