B. Catch Overflow!

本文详细解析了Codeforces上的一道编程挑战题,题目要求判断给定的代码片段在执行时是否会发生溢出。通过分析代码结构,使用递归算法预估循环次数,并计算变量x的最终值,若超过2^32-1则输出OVERFLOW!!!,否则返回x的值。

链接:https://codeforces.com/contest/1175/problem/B

You are given a function ff written in some basic language. The function accepts an integer value, which is immediately written into some variable xx. xx is an integer variable and can be assigned values from 00 to 232−1232−1. The function contains three types of commands:

  • for nn — for loop;
  • end — every command between "for nn" and corresponding "end" is executed nn times;
  • add — adds 1 to xx.

After the execution of these commands, value of xx is returned.

Every "for nn" is matched with "end", thus the function is guaranteed to be valid. "for nn" can be immediately followed by "end"."add" command can be outside of any for loops.

Notice that "add" commands might overflow the value of xx! It means that the value of xx becomes greater than 232−1232−1 after some "add" command.

Now you run f(0)f(0) and wonder if the resulting value of xx is correct or some overflow made it incorrect.

If overflow happened then output "OVERFLOW!!!", otherwise print the resulting value of xx.

Input

The first line contains a single integer ll (1≤l≤1051≤l≤105) — the number of lines in the function.

Each of the next ll lines contains a single command of one of three types:

  • for nn (1≤n≤1001≤n≤100) — for loop;
  • end — every command between "for nn" and corresponding "end" is executed nn times;
  • add — adds 1 to xx.

Output

If overflow happened during execution of f(0)f(0), then output "OVERFLOW!!!", otherwise print the resulting value of xx.

Examples

input

Copy

9
add
for 43
end
for 10
for 15
add
end
add
end

output

Copy

161

input

Copy

2
for 62
end

output

Copy

0

input

Copy

11
for 100
for 100
for 100
for 100
for 100
add
end
end
end
end
end

output

Copy

OVERFLOW!!!

Note

In the first example the first "add" is executed 1 time, the second "add" is executed 150 times and the last "add" is executed 10 times. Note that "for nn" can be immediately followed by "end" and that "add" can be outside of any for loops.

In the second example there are no commands "add", thus the returning value is 0.

In the third example "add" command is executed too many times, which causes xx to go over 232−1232−1.

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
main()
{
	ll t,n,a=0;
	cin>>t;
	ll m=(1LL<<32);
	string s;
	vector<ll>v;
	v.push_back(1);
	while(t--)
	{
	    cin>>s;
	    if(s=="add")
	        a=a+v.back();
	   if(s=="for")
	   {
	   		cin>>n;
	       v.push_back(min(m,v.back()*n));
	   }
	   if(s=="end")
	       v.pop_back();
	}
	  if(a>=m)cout<<"OVERFLOW!!!";
	    else cout<<a;
	    return 0;
} 

 

2025-10-22 15:54:15.470|ERROR|atsmtdatabridge|pool-2-thread-8|||com.alipay.databridge.nirvana.common.util.SqlParserUtil|Failed to parse SQL: CREATE VIEW IF NOT EXISTS mdtrt_d_v4_v2_zkiyg AS SELECT `mdtrt_id`, `psn_no`, `psn_cert_type`, `gend`, `brdy`, `age`, `insutype`, `insu_admdvs`, `fixmedins_code`, `fixmedins_name`, `hosp_lv`, `begntime`, `endtime`, `med_type`, `dscg_maindiag_code`, `dise_no`, `dise_name`, `oprn_oprt_code`, `oprn_oprt_name`, `otp_diag_info`, `vali_flag`, `dscg_maindiag_name` FROM scene_project_9.mdtrt_d_v4 net.sf.jsqlparser.JSQLParserException: Encountered unexpected token: "CREATE" "CREATE" at line 1, column 1. Was expecting one of: ";" "CALL" "COMMENT" "COMMIT" "DECLARE" "DELETE" "DESCRIBE" "DROP" "EXEC" "EXECUTE" "EXPLAIN" "GRANT" "INSERT" "MERGE" "SET" "SHOW" "TRUNCATE" "UPDATE" "UPSERT" "USE" "VALUES" "WITH" at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:188) ~[jsqlparser-4.0.jar!/:?] at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:176) ~[jsqlparser-4.0.jar!/:?] at com.alipay.databridge.nirvana.common.util.SqlParserUtil.containsSelectStatement(SqlParserUtil.java:135) ~[databridge-nirvana-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.core.task.service.impl.TaskServiceImpl.taskPubCheck(TaskServiceImpl.java:247) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.core.task.service.impl.TaskServiceImpl.submitTask(TaskServiceImpl.java:174) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.core.task.service.impl.TaskServiceImpl$$FastClassBySpringCGLIB$$f36842e2.invoke(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.ds.sdk.log.audit.LoggingAspect.logMethodExecution(LoggingAspect.java:63) ~[databridge_log_sdk-0.0.3.jar!/:?] at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_422] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_422] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.26.jar!/:5.3.26] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.26.jar!/:5.3.26] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.databridge.dataprocess.core.task.service.impl.TaskServiceImpl$$EnhancerBySpringCGLIB$$b4248f99.submitTask(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.biz.task.impl.TaskManagerImpl.submitTask(TaskManagerImpl.java:121) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.biz.task.impl.TaskManagerImpl$$FastClassBySpringCGLIB$$37fd097b.invoke(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.ds.sdk.log.audit.LoggingAspect.logMethodExecution(LoggingAspect.java:63) ~[databridge_log_sdk-0.0.3.jar!/:?] at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_422] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_422] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.databridge.dataprocess.biz.task.impl.TaskManagerImpl$$EnhancerBySpringCGLIB$$8646f22f.submitTask(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.biz.apiimpl.DataProcessTaskApiImpl.createTaskPubObj(DataProcessTaskApiImpl.java:134) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.dataprocess.biz.apiimpl.DataProcessTaskApiImpl$$FastClassBySpringCGLIB$$42eef9cc.invoke(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.databridge.dataprocess.biz.apiimpl.DataProcessTaskApiImpl$$EnhancerBySpringCGLIB$$dc3d36e5.createTaskPubObj(<generated>) ~[databridge-nirvana-dataprocess-1.0.0.jar!/:?] at com.alipay.databridge.nirvana.inflow.core.task.dag.InflowSQLTaskCreator.publishInflowTask(InflowSQLTaskCreator.java:276) ~[databridge-nirvana-1.0.0.jar!/:?] at com.alipay.databridge.nirvana.inflow.core.task.dag.InflowSQLTaskCreator.process(InflowSQLTaskCreator.java:132) ~[databridge-nirvana-1.0.0.jar!/:?] at com.alipay.databridge.nirvana.inflow.core.task.dag.InflowSQLTaskCreator.process(InflowSQLTaskCreator.java:60) ~[databridge-nirvana-1.0.0.jar!/:?] at com.alipay.databridge.nirvana.inflow.core.task.dag.InflowSQLTaskCreator$$FastClassBySpringCGLIB$$74120868.invoke(<generated>) ~[databridge-nirvana-1.0.0.jar!/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.26.jar!/:5.3.26] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.26.jar!/:5.3.26] at com.alipay.ds.sdk.log.audit.LoggingAspect.logMethodExecution(LoggingAspect.java:63) ~[databridge_log_sdk-0.0.3.jar!/:?] at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_422] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_422] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-a
10-23
2025-12-23T10:05:53.310+08:00 ERROR 16790 --- [syncdata] [history-sync-35] c.b.s.d.service.TdengineManageService : 检查或创建子表 my_battery_info_alarm_M240910700000001 失败 java.sql.SQLException: TDengine ERROR (0x216): sql: CREATE TABLE IF NOT EXISTS my_battery_info_alarm_M240910700000001 USING my_battery_info_alarm TAGS ('M240910700000001', '38', '48', '000001000000000000000000'), desc: syntax error near '000001000000000000000000' (int data overflow) at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:95) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:97) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:78) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:608) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:353) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.flushGroupedData(HistorySyncService.java:316) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryWindow(HistorySyncService.java:602) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryData(HistorySyncService.java:156) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.DataSyncService.lambda$executeFullSync$2(DataSyncService.java:101) ~[!/:0.0.1-SNAPSHOT] at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] 2025-12-23T10:05:53.317+08:00 ERROR 16790 --- [syncdata] [history-sync-35] c.b.s.data.service.HistorySyncService : 批量插入数据失败 java.lang.RuntimeException: 创建子表失败: my_battery_info_alarm_M240910700000001 at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:614) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:353) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.flushGroupedData(HistorySyncService.java:316) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryWindow(HistorySyncService.java:602) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryData(HistorySyncService.java:156) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.DataSyncService.lambda$executeFullSync$2(DataSyncService.java:101) ~[!/:0.0.1-SNAPSHOT] at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: java.sql.SQLException: TDengine ERROR (0x216): sql: CREATE TABLE IF NOT EXISTS my_battery_info_alarm_M240910700000001 USING my_battery_info_alarm TAGS ('M240910700000001', '38', '48', '000001000000000000000000'), desc: syntax error near '000001000000000000000000' (int data overflow) at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:95) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:97) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:78) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:608) ~[!/:0.0.1-SNAPSHOT] ... 9 common frames omitted 2025-12-23T10:05:53.318+08:00 ERROR 16790 --- [syncdata] [history-sync-35] c.b.s.data.service.HistorySyncService : 同步历史数据失败 - 表: my_battery_info_alarm java.lang.RuntimeException: 批量插入数据失败 at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:431) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.flushGroupedData(HistorySyncService.java:316) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryWindow(HistorySyncService.java:602) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryData(HistorySyncService.java:156) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.DataSyncService.lambda$executeFullSync$2(DataSyncService.java:101) ~[!/:0.0.1-SNAPSHOT] at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: java.lang.RuntimeException: 创建子表失败: my_battery_info_alarm_M240910700000001 at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:614) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:353) ~[!/:0.0.1-SNAPSHOT] ... 8 common frames omitted Caused by: java.sql.SQLException: TDengine ERROR (0x216): sql: CREATE TABLE IF NOT EXISTS my_battery_info_alarm_M240910700000001 USING my_battery_info_alarm TAGS ('M240910700000001', '38', '48', '000001000000000000000000'), desc: syntax error near '000001000000000000000000' (int data overflow) at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:95) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:97) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:78) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:608) ~[!/:0.0.1-SNAPSHOT] ... 9 common frames omitted 2025-12-23T10:05:53.324+08:00 ERROR 16790 --- [syncdata] [history-sync-35] c.bms.sync.data.service.DataSyncService : 同步历史数据失败 - 表: my_battery_info_alarm java.lang.RuntimeException: 同步历史数据失败 at com.bms.sync.data.service.HistorySyncService.syncHistoryData(HistorySyncService.java:201) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.DataSyncService.lambda$executeFullSync$2(DataSyncService.java:101) ~[!/:0.0.1-SNAPSHOT] at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: java.lang.RuntimeException: 批量插入数据失败 at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:431) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.flushGroupedData(HistorySyncService.java:316) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryWindow(HistorySyncService.java:602) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.syncHistoryData(HistorySyncService.java:156) ~[!/:0.0.1-SNAPSHOT] ... 5 common frames omitted Caused by: java.lang.RuntimeException: 创建子表失败: my_battery_info_alarm_M240910700000001 at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:614) ~[!/:0.0.1-SNAPSHOT] at com.bms.sync.data.service.HistorySyncService.insertBatchData(HistorySyncService.java:353) ~[!/:0.0.1-SNAPSHOT] ... 8 common frames omitted Caused by: java.sql.SQLException: TDengine ERROR (0x216): sql: CREATE TABLE IF NOT EXISTS my_battery_info_alarm_M240910700000001 USING my_battery_info_alarm TAGS ('M240910700000001', '38', '48', '000001000000000000000000'), desc: syntax error near '000001000000000000000000' (int data overflow) at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:95) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:97) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.taosdata.jdbc.rs.RestfulStatement.execute(RestfulStatement.java:78) ~[taos-jdbcdriver-3.3.3.jar!/:na] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] at com.bms.sync.data.service.TdengineManageService.checkAndCreateSubTable(TdengineManageService.java:608) ~[!/:0.0.1-SNAPSHOT] ... 9 common frames omitted
12-24
<!-- 📚📚📚 Pro-Table 文档: https://juejin.cn/post/7166068828202336263 --> <template> <!-- 查询表单 --> <SearchForm v-show="isShowSearch" :search="_search" :reset="_reset" :columns="searchColumns" :search-param="searchParam" :search-col="searchCol" /> <!-- 表格主体 --> <div class="card table-main"> <!-- 表格头部 操作按钮 --> <div class="table-header"> <div class="header-button-lf"> <slot name="tableHeader" :selected-list="selectedList" :selected-list-ids="selectedListIds" :is-selected="isSelected" /> </div> <div v-if="toolButton" class="header-button-ri"> <slot name="toolButton"> <el-button v-if="showToolButton('refresh')" :icon="Refresh" circle @click="refreshData" /> <el-button v-if="showToolButton('setting') && columns.length" :icon="Operation" circle @click="openColSetting" /> <el-button v-if="showToolButton('search') && searchColumns?.length" :icon="Search" circle @click="isShowSearch = !isShowSearch" /> </slot> </div> </div> <!-- 表格上方的提示信息 --> <div v-if="tableTipsFlag"> <slot name="tableTips"></slot> </div> <!-- 表格主体 --> <el-table ref="tableRef" v-bind="$attrs" :data="processTableData" :border="border" :row-key="rowKey" @selection-change="selectionChange" > <!-- 默认插槽 --> <slot /> <template v-for="item in tableColumns" :key="item"> <!-- selection || radio || index || expand || sort --> <el-table-column v-if="item.type && columnTypes.includes(item.type)" v-bind="item" :align="item.align ?? 'center'" :reserve-selection="item.type == 'selection'" :selectable="item.isSelectable"> <template #default="scope"> <!-- expand --> <template v-if="item.type == 'expand'"> <component :is="item.render" v-bind="scope" v-if="item.render" /> <slot v-else :name="item.type" v-bind="scope" /> </template> <!-- radio --> <el-radio v-if="item.type == 'radio'" v-model="radio" :label="scope.row[rowKey]"> <!-- <i></i> --> </el-radio> <!-- sort --> <el-tag v-if="item.type == 'sort'" class="move"> <el-icon> <DCaret /></el-icon> </el-tag> </template> </el-table-column> <!-- other --> <TableColumn v-if="!item.type && item.prop && item.isShow" :column="item"> <template v-for="slot in Object.keys($slots)" #[slot]="scope"> <slot :name="slot" v-bind="scope" /> </template> </TableColumn> </template> <!-- 插入表格最后一行之后的插槽 --> <template #append> <slot name="append" /> </template> <!-- 无数据 --> <template #empty> <div class="table-empty"> <slot name="empty"> <img src="@/assets/images/notData.png" alt="notData" /> <div>暂无数据</div> </slot> </div> </template> </el-table> <!-- 分页组件 --> <slot name="pagination"> <Pagination v-if="pagination" :pageable="pageable" :handle-size-change="handleSizeChange" :handle-current-change="handleCurrentChange" /> </slot> </div> <!-- 列设置 --> <ColSetting v-if="toolButton" ref="colRef" v-model:col-setting="colSetting" /> </template> <script setup lang="ts" name="ProTable"> import { ref, watch, provide, onMounted, unref, computed, reactive } from "vue"; import { ElTable } from "element-plus"; import { useTable } from "@/hooks/useTable"; import { useSelection } from "@/hooks/useSelection"; import { BreakPoint } from "@/components/Grid/interface"; import { ColumnProps, TypeProps } from "@/components/ProTable/interface"; import { Refresh, Operation, Search } from "@element-plus/icons-vue"; import { handleProp } from "@/utils"; import SearchForm from "@/components/SearchForm/index.vue"; import Pagination from "./components/Pagination.vue"; import ColSetting from "./components/ColSetting.vue"; import TableColumn from "./components/TableColumn.vue"; import Sortable from "sortablejs"; export interface ProTableProps { columns: ColumnProps[]; // 列配置项 ==> 必传 data?: any[]; // 静态 table data 数据,若存在则不会使用 requestApi 返回的 data ==> 非必传 requestApi?: (params: any) => Promise<any>; // 请求表格数据的 api ==> 非必传 requestAuto?: boolean; // 是否自动执行请求 api ==> 非必传(默认为true) requestError?: (params: any) => void; // 表格 api 请求错误监听 ==> 非必传 dataCallback?: (data: any) => any; // 返回数据的回调函数,可以对数据进行处理 ==> 非必传 title?: string; // 表格标题 ==> 非必传 pagination?: boolean; // 是否需要分页组件 ==> 非必传(默认为true) initParam?: any; // 初始化请求参数 ==> 非必传(默认为{}) border?: boolean; // 是否带有纵向边框 ==> 非必传(默认为true) toolButton?: ("refresh" | "setting" | "search")[] | boolean; // 是否显示表格功能按钮 ==> 非必传(默认为true) rowKey?: string; // 行数据的 Key,用来优化 Table 的渲染,当表格数据多选时,所指定的 id ==> 非必传(默认为 id) searchCol?: number | Record<BreakPoint, number>; // 表格搜索项 每列占比配置 ==> 非必传 { xs: 1, sm: 2, md: 2, lg: 3, xl: 4 } tableTipsFlag?: boolean; // 表格上方的提示信息 ==> 非必传 (默认为false) } // 接受父组件参数,配置默认值 const props = withDefaults(defineProps<ProTableProps>(), { columns: () => [], requestAuto: true, pagination: true, initParam: {}, border: true, toolButton: true, rowKey: "id", searchCol: () => ({ xs: 1, sm: 3, md: 3, lg: 4, xl: 5 }), tableTipsFlag: false }); // table 实例 const tableRef = ref<InstanceType<typeof ElTable>>(); // column 列类型 const columnTypes: TypeProps[] = ["selection", "radio", "index", "expand", "sort"]; // 是否显示搜索模块 const isShowSearch = ref(true); // 控制 ToolButton 显示 const showToolButton = (key: "refresh" | "setting" | "search") => { return Array.isArray(props.toolButton) ? props.toolButton.includes(key) : props.toolButton; }; // 单选值 const radio = ref(""); // 表格多选 Hooks const { selectionChange, selectedList, selectedListIds, isSelected } = useSelection(props.rowKey); // 表格操作 Hooks const { tableData, pageable, searchParam, searchInitParam, getTableList, search, reset, handleSizeChange, handleCurrentChange } = useTable(props.requestApi, props.initParam, props.pagination, props.dataCallback, props.requestError, tableRef); // 清空选中数据列表 const clearSelection = () => tableRef.value!.clearSelection(); // 初始化表格数据 && 拖拽排序 onMounted(() => { dragSort(); props.requestAuto && getTableList(); props.data && (pageable.value.total = props.data.length); }); // 处理表格数据 const processTableData = computed(() => { if (!props.data) return tableData.value; if (!props.pagination) return props.data; return props.data.slice( (pageable.value.pageNum - 1) * pageable.value.pageSize, pageable.value.pageSize * pageable.value.pageNum ); }); // 监听页面 initParam 改化,重新获取表格数据 watch(() => props.initParam, () => { // 将初始化initParam参数赋值给表单 searchParam.value = { ...searchParam.value, ...props.initParam, }; getTableList() }, { deep: true }); // 接收 columns 并设置为响应式 const tableColumns = reactive<ColumnProps[]>(props.columns); // 扁平化 columns const flatColumns = computed(() => flatColumnsFunc(tableColumns)); // 定义 enumMap 存储 enum 值(避免异步请求无法格式化单元格内容 || 无法填充搜索下拉选择) const enumMap = ref(new Map<string, { [key: string]: any }[]>()); const setEnumMap = async ({ prop, enum: enumValue }: ColumnProps) => { if (!enumValue) return; // 如果当前 enumMap 存在相同的值 return if (enumMap.value.has(prop!) && (typeof enumValue === "function" || enumMap.value.get(prop!) === enumValue)) return; // 当前 enum 为静态数据,则直接存储到 enumMap if (typeof enumValue !== "function") return enumMap.value.set(prop!, unref(enumValue!)); // 为了防止接口执行慢,而存储慢,导致重复请求,所以预先存储为[],接口返回后再二次存储 enumMap.value.set(prop!, []); // 当前 enum 为后台数据需要请求数据,则调用该请求接口,并存储到 enumMap const { data } = await enumValue(); enumMap.value.set(prop!, data); }; const refreshData = () => { pageable.value.pageNum = 1; getTableList(); }; // 注入 enumMap provide("enumMap", enumMap); // 扁平化 columns 的方法 const flatColumnsFunc = (columns: ColumnProps[], flatArr: ColumnProps[] = []) => { columns.forEach(async col => { if (col._children?.length) flatArr.push(...flatColumnsFunc(col._children)); flatArr.push(col); // column 添加默认 isShow && isFilterEnum 属性值 col.isShow = col.isShow ?? true; col.isFilterEnum = col.isFilterEnum ?? true; // 设置 enumMap await setEnumMap(col); }); return flatArr.filter(item => !item._children?.length); }; // 过滤需要搜索的配置项 && 排序 const searchColumns = computed(() => { return flatColumns.value ?.filter(item => item.search?.el || item.search?.render) .sort((a, b) => a.search!.order! - b.search!.order!); }); // 设置 搜索表单默认排序 && 搜索表单项的默认值 searchColumns.value?.forEach((column, index) => { column.search!.order = column.search?.order ?? index + 2; const key = column.search?.key ?? handleProp(column.prop!); const defaultValue = column.search?.defaultValue; if (defaultValue !== undefined && defaultValue !== null) { searchInitParam.value[key] = defaultValue; searchParam.value[key] = defaultValue; } }); // 列设置 ==> 需要过滤掉不需要设置的列 const colRef = ref(); const colSetting = tableColumns!.filter(item => { const { type, prop, isShow } = item; return !columnTypes.includes(type!) && prop !== "operation" && isShow; }); const openColSetting = () => colRef.value.openColSetting(); // 定义 emit 事件 const emit = defineEmits<{ search: []; reset: []; dargSort: [{ newIndex?: number; oldIndex?: number }]; }>(); const _search = () => { search(); emit("search"); }; const _reset = () => { reset(); emit("reset"); }; // 拖拽排序 const dragSort = () => { const tbody = document.querySelector(".el-table__body-wrapper tbody") as HTMLElement; Sortable.create(tbody, { handle: ".move", animation: 300, onEnd({ newIndex, oldIndex }) { const [removedItem] = processTableData.value.splice(oldIndex!, 1); processTableData.value.splice(newIndex!, 0, removedItem); emit("dargSort", { newIndex, oldIndex }); } }); }; // 暴露给父组件的参数和方法 (外部需要什么,都可以从这里暴露出去) defineExpose({ element: tableRef, tableData: processTableData, radio, pageable, searchParam, searchInitParam, getTableList, search, reset, handleSizeChange, handleCurrentChange, clearSelection, enumMap, isSelected, selectedList, selectedListIds, refreshData: getTableList // 暴露刷新方法 }); </script> <template> <RenderTableColumn v-bind="column" /> </template> <script setup lang="tsx" name="TableColumn"> import { inject, ref, useSlots } from "vue"; import { ColumnProps, RenderScope, HeaderRenderScope } from "@/components/ProTable/interface"; import { filterEnum, formatValue, handleProp, handleRowAccordingToProp } from "@/utils"; import { ElMessage } from "element-plus"; defineProps<{ column: ColumnProps }>(); const slots = useSlots(); const enumMap = inject("enumMap", ref(new Map())); // 渲染表格数据 const renderCellData = (item: ColumnProps, scope: RenderScope<any>) => { return enumMap.value.get(item.prop) && item.isFilterEnum ? filterEnum(handleRowAccordingToProp(scope.row, item.prop!), enumMap.value.get(item.prop)!, item.fieldNames) : formatValue(handleRowAccordingToProp(scope.row, item.prop!)); }; // 获取 tag 类型 const getTagType = (item: ColumnProps, scope: RenderScope<any>) => { return ( filterEnum(handleRowAccordingToProp(scope.row, item.prop!), enumMap.value.get(item.prop), item.fieldNames, "tag") || "primary" ); }; // 复制文本到剪贴板的函数 const copyTextToClipboard = (text: string) => { navigator.clipboard.writeText(text).then(() => { // 复制成功提示(可选) ElMessage({ message: `复制成功!`, type: 'success' }); }).catch(err => { console.error('复制失败 ', err); }); }; const RenderTableColumn = (item: ColumnProps) => { return ( <> {item.isShow && ( <el-table-column {...item} align={item.align ?? "center"} showOverflowTooltip={ (renderCellData(item, { row: {} as any } as RenderScope<any>) as string).toString().length > 20 || (item.showOverflowTooltip ?? item.prop !== "operation") } > {{ default: (scope: RenderScope<any>) => { const cellData = renderCellData(item, scope); const cellText = typeof cellData === 'string' ? cellData : (cellData as any)?.toString(); // 判断是否为操作列 const isOperationColumn = item.prop === 'operation'; // 添加点击事件以复制文本(仅非操作列) const handleCellClick = (event: MouseEvent) => { if (isOperationColumn || item.copy === false) return; // 操作列不触发复制 event.stopPropagation(); copyTextToClipboard(cellText); }; return ( <div onClick={handleCellClick} class={{ 'table-cell-content': !isOperationColumn }} style={{ cursor: isOperationColumn ? 'default' : 'pointer' }} > {item._children ? item._children.map(child => RenderTableColumn(child)) : item.render ? item.render(scope) : slots[handleProp(item.prop!)] ? slots[handleProp(item.prop!)]!(scope) : item.tag ? <el-tag type={getTagType(item, scope)}>{cellData}</el-tag> : cellData} </div> ) }, header: (scope: HeaderRenderScope<any>) => { if (item.headerRender) return item.headerRender(scope); if (slots[`${handleProp(item.prop!)}Header`]) return slots[`${handleProp(item.prop!)}Header`]!(scope); return item.label; } }} </el-table-column> )} </> ); }; </script> <style lang="scss"> :v-deep(.el-popover) { background-color: #f9f9f9; border-color: #dddddd; } :v-deep(.el-popover.el-popper) { max-width: 50vw; max-height: 50vh; overflow: auto; } /** 非操作列单元格样式,超出宽度用省略号显示 */ .table-cell-content { width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style> 展示数据为“”时,列表上会展示--,去掉这个默认显示
09-04
<!-- --> <template> <div id="teacherinfoimport" class="teacherinfoimport"> <el-form label-position="left" label-width="140px" :model="teacherinfo" class="demo-ruleForm" :rules="rules" :blur="workcompleteornot()" name="teacherinfo" ref="teacherinfo"> <!-- 图片导入 --> <el-form-item> <el-upload action="#" :on-remove="handleRemove" :file-list="files.photo" :limit="1" :on-change="PhotoChange" :auto-upload="false" style="width:20%;position:relative;left:30%;height:0px" list-type="picture"> <el-button size="small" type="primary">点击上传照片(单张)</el-button> </el-upload> </el-form-item> <!-- 老师姓名 --> <el-form-item label="姓名:" prop="teacher"> <el-input v-model="teacherinfo.teacher" size="small" maxlength="20" placeholder="老师姓名" style="width:120px;" id="teacher"></el-input> </el-form-item> <!-- 老师性别 --> <el-form-item label="性别:" prop="gender"> <el-radio-group v-model="teacherinfo.gender"> <el-radio :label=0>男</el-radio> <el-radio :label=1>女</el-radio> </el-radio-group> </el-form-item> <!-- 老师生日 --> <el-form-item label="出生日期:" prop="birthdate"> <el-date-picker type="date" placeholder="选择出生日期" :clearable='false' size="small" value-format="yyyy-MM-dd" v-model="teacherinfo.birthdate" style="width: 12%;" id="birthdate"></el-date-picker> </el-form-item> <!-- 联系方式 --> <el-form-item label="联系方式:" prop="telphone"> <el-input v-model="teacherinfo.telphone" size="small" style="width:220px;" placeholder="座机/手机/邮箱" id="telphone"></el-input> </el-form-item> <!-- 办公地址 --> <el-form-item label="办公地址:" prop="officelocation"> <el-input v-model="teacherinfo.officelocation" size="small" style="width:220px;" placeholder="请输入办公室地址"></el-input> </el-form-item> <!-- 科研院所 --> <el-form-item label="科研院所:" prop="school"> <el-autocomplete popper-class="my-autocomplete" v-model="teacherinfo.school" :fetch-suggestions="querySearch" size="small" style="width:220px" placeholder="学校/科研单位" id="school"> <template slot-scope="{ item }"> <div class="name">{{ item.value }}</div> </template> </el-autocomplete> </el-form-item> <!-- 学院系别 --> <el-form-item label="学院系别:" prop="department"> <el-autocomplete popper-class="my-autocomplete" v-model="teacherinfo.department" :fetch-suggestions="querydepartments" size="small" style="width:220px" placeholder="学院/系/专业/室" id="department"> <template slot-scope="{ item }"> <div class="name">{{ item.value }}</div> </template> </el-autocomplete> </el-form-item> <!-- 职务/职称 --> <el-form-item label="职称/职务:" prop="title"> <el-input v-model="teacherinfo.title" size="small" placeholder="教授/研究院/院长等" style="width:220px;" id="title"></el-input> </el-form-item> <!-- 团队成员 --> <el-form-item label="团队成员:" prop="groupmember"> <el-input v-model="teacherinfo.groupmember" size="small" placeholder="多少人(硕士人数,博士人数)" style="width:320px;" id="groupmember"></el-input> </el-form-item> <!-- 研究方向 --> <el-form-item label="研究方向:" prop="researchdirector"> <el-input type="textarea" placeholder="请输入内容" :autosize="{ minRows: 7, maxRows: 7}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.researchdirector" id="researchdirector" maxlength="500" show-word-limit> </el-input> </el-form-item> <!-- 技术专长 --> <el-form-item label="技术专长:" prop="expertise"> <el-input v-model="teacherinfo.expertise" size="small" placeholder="请输入技术专长" style="width:320px;" id="expertise"></el-input> </el-form-item> <!-- 技术领域 --> <el-form-item label="技术领域:" prop="field"> <el-input v-model="teacherinfo.field" size="small" placeholder="器件,材料,算法,设备,硬件+算法,医学" style="width:320px;" id="field"></el-input> </el-form-item> <!-- 工作经历 --> <el-form-item label="工作经历:" prop="experience"> <el-input type="textarea" placeholder="请输入工作经历" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.experience" maxlength="1000" show-word-limit id="experience"> </el-input> </el-form-item> <!-- 获奖荣誉 --> <el-form-item label="获奖荣誉:" prop="honor"> <el-input type="textarea" placeholder="请输入获奖荣誉" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.honor" maxlength="500" show-word-limit id="honor"> </el-input> </el-form-item> <!-- 纵向项目经历 --> <el-form-item label="纵向项目经历:" prop="longitudinal"> <el-input type="textarea" placeholder="按条目,项目名称-金额-合作单位-技术指标-产业化" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.longitudinal" maxlength="250" show-word-limit id="longitudinal"> </el-input> </el-form-item> <!-- 横向项目经历 --> <el-form-item label="横向项目经历:" prop="crossing"> <el-input type="textarea" placeholder="按条目,项目名称-金额-合作单位-技术指标-产业化" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.crossing" maxlength="250" show-word-limit id="crossing"> </el-input> </el-form-item> <!-- 代表论文/专利 --> <el-form-item label="代表论文/专利:" prop="papersandpatent"> <el-input type="textarea" placeholder="按条目,名称-期刊" :autosize="{ minRows: 6, maxRows: 6}" style="width:450px;margin-top:1%;font-weight:normal" v-model="teacherinfo.papersandpatent" maxlength="500" show-word-limit id="papersandpatent"> </el-input> </el-form-item> <!-- 科研成果 --> <el-form-item label="科研成果:" prop="achievements"> <el-input type="textarea" placeholder="按照1/2/3/4;成果状态:无Demo/Demo实验室阶段/中试/量产;成熟度1~9;合作情况:单位/产权情况" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.achievements" maxlength="500" show-word-limit id="achievements"> </el-input> </el-form-item> <!-- 科研成果文件 --> <el-form-item label="科研成果文件:"> <!-- 上传文件按钮 --> <el-upload style=" margin-right:2%;width:650px" action="#" ref="fileupload" accept="application/pdf" :multiple="false" :limit="2" :on-change="achievementschange" :on-remove="achievementsremove" :file-list="files.achievementspdf" :auto-upload="false" :show-file-list="true"> <el-button size="small" type="primary" round plain>科研成果文件(PDF,限一个,20M以内) </el-button> </el-upload> </el-form-item> <!-- 实验室设备 --> <el-form-item label="实验室设备:" prop="instruments"> <el-input v-model="teacherinfo.instruments" size="small" style="width:420px;" placeholder="主要设备/工艺能力/参数" id="instruments"></el-input> </el-form-item> <!-- 当前创业情况 --> <el-form-item label="当前创业情况:" prop="companies"> <el-input v-model="teacherinfo.companies" size="small" style="width:420px;" placeholder="兼职/创业情况" id="companies"></el-input> </el-form-item> <!-- 是否推荐 --> <el-form-item label="是否推荐:" prop="recommedation"> <el-radio-group v-model="teacherinfo.recommedation"> <el-radio :label=0>否</el-radio> <el-radio :label=1>是</el-radio> </el-radio-group> </el-form-item> <!-- 推荐卡文件 --> <el-form-item label="推荐卡文件:"> <!-- 上传文件按钮 --> <el-upload style=" margin-right:2%;width:650px" action="#" ref="fileupload" accept="application/pdf" :multiple="false" :limit="2" :on-change="recommedationchange" :on-remove="recommedationremove" :file-list="files.recommedationpdf" :auto-upload="false" :show-file-list="true"> <el-button size="small" type="primary" round plain>推荐卡(PDF,限一个,20M以内) </el-button> </el-upload> </el-form-item> <!-- 拜访情况 --> <el-form-item label="拜访情况:" prop="visittimes"> <el-input-number v-model="teacherinfo.visittimes" :min="0" label="拜访情况"></el-input-number> </el-form-item> <!-- 拜访情况文件 --> <el-form-item label="拜访情况文件:"> <!-- 上传文件按钮 --> <el-upload style=" margin-right:2%;width:650px" action="#" ref="fileupload" accept="application/pdf" :multiple="false" :limit="2" :on-change="visitexcelchange" :on-remove="visitexcelremove" :file-list="files.visitexcelpdf" :auto-upload="false" :show-file-list="true"> <el-button size="small" type="primary" round plain>会议纪要(PDF,限一个,20M以内) </el-button> </el-upload> </el-form-item> <!-- 合作项目个数 --> <el-form-item label="合作项目个数:" prop="cooprojectscount"> <el-input-number v-model="teacherinfo.cooprojectscount" :min="0" label="拜访情况"></el-input-number> </el-form-item> <!-- 与BOE合作项目 --> <el-form-item label="与BOE合作项目:" prop="cooperationwithboe"> <el-input type="textarea" placeholder="项目名称/日期/合作组织/项目简介/PM" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.cooperationwithboe" maxlength="250" show-word-limit id="cooperationwithboe"> </el-input> </el-form-item> <!-- 人物画像 --> <el-form-item label="人物画像:" prop="portrait"> <el-input type="textarea" placeholder="老师人物心理画像" :autosize="{ minRows: 6, maxRows: 6}" style="width:650px;margin-top:1%;font-weight:normal" v-model="teacherinfo.portrait" maxlength="250" show-word-limit id="portrait"> </el-input> </el-form-item> <!-- 老师合作意愿 --> <el-form-item label="合作意愿:" prop="cooperativewillingness"> <el-rate v-model="teacherinfo.cooperativewillingness" show-text style="padding-top:0.7%" :texts="['极低','低','中','高','极高']"> </el-rate> </el-form-item> <!-- 团队实力 --> <el-form-item label="团队实力:" prop="teamstrength"> <el-rate v-model="teacherinfo.teamstrength" show-text style="padding-top:0.7%" :texts="['极低','低级','中级','高级','顶级']"> </el-rate> </el-form-item> <!-- 合作度 --> <el-form-item label="合作度:" prop="cooperationdegree"> <el-rate v-model="teacherinfo.cooperationdegree" show-text :max="10" style="padding-top:0.7%" :texts="['1','2','3','4','5','6','7','8','9','10']"> </el-rate> </el-form-item> <!-- 是否对接BOE需求 --> <el-form-item label="是否对接BOE需求:" prop="dockingboerequest"> <el-radio-group v-model="teacherinfo.dockingboerequest"> <el-radio :label=0>否</el-radio> <el-radio :label=1>是</el-radio> </el-radio-group> </el-form-item> <!-- 备注 --> <el-form-item label="备注:" prop="remark"> <el-input v-model="teacherinfo.remark" size="small" placeholder="对接BOE何需求/轶事/口碑" style="width:650px;" id="remark"></el-input> </el-form-item> <div class="submitClass"> <div class="info"> <b>填写提示:</b> <p> 1. 带 <span style="color:red">*</span> 为必填项 </p> <p> 2. 部分信息会有初始值,若不填写,将按初始值导入 </p> </div> <b> 填写进度: </b> <el-progress :percentage="percentage" status="success" style="margin-top:3%;margin-bottom:3%" :text-inside="true" :stroke-width="15"></el-progress> <el-form-item> <el-button icon="el-icon-upload2" size="small" plain type="primary" round style="margin-right:2%" @click="onSubmit">信息上传</el-button> </el-form-item> </div> </el-form> </div> </template> <script> import { request } from "../../network/request"; export default { data () { return { schools: [], departments: [], percentage: 0, disabled: false, files: { photo: [], achievementspdf: [], recommedationpdf: [], visitexcelpdf: [], }, dialogImageUrl: "", dialogVisible: false, teacherinfo: { teacher: '', gender: 0, birthdate: '', telphone: '', officelocation: '', school: '', department: '', title: '', photoname: '', groupmember: '', researchdirector: '', expertise: '', field: '', experience: '', honor: '', longitudinal: '', crossing: '', papersandpatent: '', achievements: '', achievementspdf: '', instruments: '', companies: '', recommedation: 0, recommedationpdf: '', visittimes: 0, visitexcel: '', cooprojectscount: 0, cooperationwithboe: '', portrait: '', cooperativewillingness: null, teamstrength: null, cooperationdegree: null, remark: '', dockingboerequest: 0 }, rules: { //提示规则 teacher: [ { required: true, message: '请输入老师姓名', trigger: 'blur' }, ], gender: [ { required: true, }, ], birthdate: [ { type: 'string', required: true, message: '请选择出生日期', trigger: 'blur' } ], telphone: [{ required: true, message: '请输入联系方式', /* validator: checkTelphone, */ trigger: 'blur' }], officelocation: [{ required: false, },], school: [{ required: true, message: '请输入科研院所', trigger: 'change' },], department: [{ required: true, message: '请输入学院系别', trigger: 'change' },], title: [{ required: true, message: '请输入职称', trigger: 'blur' },], groupmember: [{ required: true, message: '请输入团队成员', trigger: 'blur' },], researchdirector: [{ required: true, message: '请输入研究方向', trigger: 'blur' },], expertise: [{ required: true, message: '请输入技术专长', trigger: 'blur' },], field: [{ required: true, message: '请输入技术领域', trigger: 'blur' },], experience: [{ required: false, },], honor: [{ required: false, },], longitudinal: [{ required: true, message: '请输入纵向项目经历', trigger: 'blur' },], crossing: [{ required: true, message: '请输入横向项目经历', trigger: 'blur' },], papersandpatent: [{ required: false, },], achievements: [{ required: true, message: '请输入科研成果', trigger: 'blur' },], instruments: [{ required: false, },], companies: [{ required: false, },], recommedation: [{ required: true, },], visittimes: [{ required: true, },], cooprojectscount: [{ required: true, },], cooperationwithboe: [{ required: true, message: '请输入与BOE合作项目', trigger: 'blur' },], portrait: [{ required: false, },], cooperativewillingness: [{ required: false, },], teamstrength: [{ required: false, },], cooperationdegree: [{ required: false, },], remark: [{ required: false, },], dockingboerequest: [{ required: true, },], } } }, methods: { //科研院所的输入建议 querySearch (queryString, cb) { var schools = this.schools; var results = queryString ? schools.filter(this.createFilter(queryString)) : schools; // 调用 callback 返回建议列表的数据 cb(results); }, createFilter (queryString) { return (labelValue) => { return (labelValue.value.toLowerCase().indexOf(queryString.toLowerCase()) >= 0); }; }, // 学院系别的输入建议 querydepartments (queryString, cb) { let department = []; for (let i = 0; i < this.departments.length; i++) { let label = this.departments[i].label if (this.teacherinfo.school === label) { department = this.departments[i].labels; break; } } if (department.length === 0) department = [{ 'value': '无匹配输入建议' }] var results = queryString ? department.filter(this.createFilter(queryString)) : department; clearTimeout(this.timeout); this.timeout = setTimeout(() => { cb(results); }, 1000 * Math.random()); }, //锚点设置,不满足提交条件则快速定位到页面 Formarchor (rule, callback) { this.$refs["teacherinfo"].validate((valid, dom) => { if (valid) {//验证通过 callback(true); } else { //验证未通过 for (let key of Object.keys(dom)) { //获取ref dom 点进行锚点定位 let section = document.getElementById(key); section.scrollIntoView(); break; } callback(false); } }) }, onSubmit () { let check = false; this.Formarchor('', (res) => { check = !res; });//填写表单验证是否通过 if (check) { return; //返回,不执行下面的提交代码 } // 信息传输,不包括文件 // 服务方式 创建加载中 let loadingText = '教师信息上传中...'; const loading = this.$loading({ lock: true, text: loadingText, spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' }); let config = { url: "/teacher/teacherinfo/uploadteacherinfo", method: "post", headers: { 'Content-Type': 'application/json' }, data: this.teacherinfo } request(config).then( res => { let type = res.data.success == true ? "success" : "error" this.$message({ showClose: true, message: res.data.msg, type: type }); if (res.data.success) { //信息导入成功,开始文件传输 let id = res.data.data.id; let teacher = res.data.data.teacher; let gender = res.data.data.gender; let birthdate = res.data.data.birthdate; //提交成功,把表单给重置一下 Object.assign(this.$data.teacherinfo, this.$options.data().teacherinfo); //图片文件 if (this.files.photo.length != 0) { //有图片文件,进行图片上传 loadingText = '图片上传中...'; this.uploadFile(this.files.photo.pop(), "照片", id, teacher, gender, birthdate); } if (this.files.achievementspdf.length != 0) { loadingText = '科研文件上传中...'; this.uploadFile(this.files.achievementspdf.pop(), "科研", id, teacher, gender, birthdate); } if (this.files.recommedationpdf.length != 0) { loadingText = '推荐卡上传中...'; this.uploadFile(this.files.recommedationpdf.pop(), "推荐", id, teacher, gender, birthdate); } if (this.files.visitexcelpdf.length != 0) { loadingText = '会议文件上传中...'; // for (let i = 0; i < this.files.visitexcel.length; i) { this.uploadFile(this.files.visitexcelpdf.pop(), "会议", id, teacher, gender, birthdate); // } } } } ) loading.close(); }, //老师文件的上传 uploadFile (file, fileType, id, teacher, gender, birthdate) { let param = new FormData(); //form 表单 param.append("file", file.raw); param.append("fileType", fileType); param.append("id", id); param.append("teacher", teacher); param.append("gender", gender); param.append("birthdate", birthdate); let config = { //multipart/form-data headers: { 'Content-Type': 'multipart/form-data' }, url: "/teacher/teacherinfo/uploadteacherfile", method: "post", data: param } request(config).then( res => { let type = res.data.success ? "success" : "error"; this.$message({ showClose: true, message: res.data.msg, type: type, duration: 12000 }); } ) }, //计算填写进度 workcompleteornot () { let totoalCount = 25; let successCount = 0; if (this.teacherinfo.teacher != '') successCount++; if (this.teacherinfo.birthdate != '') successCount++; if (this.teacherinfo.telphone != '') successCount++; if (this.teacherinfo.officelocation != '') successCount++; if (this.teacherinfo.school != '') successCount++; if (this.teacherinfo.department != '') successCount++; if (this.teacherinfo.title != '') successCount++; if (this.teacherinfo.groupmember != '') successCount++; if (this.teacherinfo.researchdirector != '') successCount++; if (this.teacherinfo.expertise != '') successCount++; if (this.teacherinfo.field != '') successCount++; if (this.teacherinfo.experience != '') successCount++; if (this.teacherinfo.honor != '') successCount++; if (this.teacherinfo.longitudinal != '') successCount++; if (this.teacherinfo.crossing != '') successCount++; if (this.teacherinfo.papersandpatent != '') successCount++; if (this.teacherinfo.achievements != '') successCount++; if (this.teacherinfo.instruments != '') successCount++; if (this.teacherinfo.companies != '') successCount++; if (this.teacherinfo.cooperationwithboe != '') successCount++; if (this.teacherinfo.portrait != '') successCount++; if (this.teacherinfo.cooperativewillingness != '' && this.teacherinfo.cooperativewillingness != null) successCount++; if (this.teacherinfo.teamstrength != '' && this.teacherinfo.teamstrength != null) successCount++; if (this.teacherinfo.cooperationdegree != '' && this.teacherinfo.cooperationdegree != null) successCount++; if (this.teacherinfo.remark != '') successCount++; this.percentage = Math.ceil((successCount / totoalCount) * 100); }, //获得科研院所和学院系别 loadAll () { let config = { url: '/teacher/teacherinfo/schoolanddepartment', method: 'post', } request(config).then( res => { this.schools = res.data.data[0]; this.departments = res.data.data[1]; }, ).catch( err => { this.$message({ showClose: true, message: "获取科研院所和学院系别失败", type: "error" }); } ) }, //科研成果PDF添加 achievementschange (file, fileList) { //验证文件格式 let fileinfo = fileList.pop(); let name = fileinfo.name; let type = name.substring(name.lastIndexOf('.'), name.length); let size = fileinfo.size / 1024; if (type.toLowerCase() === '.pdf' && size < 20000) { this.files.achievementspdf.push(fileinfo); this.teacherinfo.achievementspdf = name + ";"; // 设置pdf名字 ,加 ;后面展示解析使用 } else { this.$message({ showClose: true, message: "请选择PDF文件上传,文件大小20M以内", type: "error" }); } }, //科研成果PDF删除 achievementsremove (file, fileList) { this.files.achievementspdf.pop(); this.teacherinfo.achievementspdf = ''; }, //推荐卡PDF添加 recommedationchange (file, fileList) { let fileinfo = fileList.pop(); let name = fileinfo.name; let type = name.substring(name.lastIndexOf('.'), name.length); let size = fileinfo.size / 1024; if (type.toLowerCase() === '.pdf' && size < 20000) { this.files.recommedationpdf.push(fileinfo); this.teacherinfo.recommedationpdf = name + ";"; } else { this.$message({ showClose: true, message: "请选择PDF文件上传,文件大小20M以内", type: "error" }); } }, //推荐卡PDF删除 recommedationremove (file, fileList) { this.files.recommedationpdf.pop(); this.teacherinfo.recommedationpdf = ''; }, //会议纪要pdf文件添加 visitexcelchange (file, fileList) { let fileinfo = fileList.pop(); let name = fileinfo.name; let type = name.substring(name.lastIndexOf('.'), name.length); let size = fileinfo.size / 1024; if (type.toLowerCase() === '.pdf' && size < 20000) { this.files.visitexcelpdf.push(fileinfo); this.teacherinfo.visitexcelpdf = name + ";"; } else { this.$message({ showClose: true, message: "请选择PDF文件上传,文件大小20M以内", type: "error" }); } }, //会议纪要PDF删除 visitexcelremove (file, fileList) { this.files.visitexcelpdf.pop(); this.teacherinfo.visitexcelpdf = ''; }, // visitexcelchange (file, fileList) { // let name = ''; // for (let i = 0; i < fileList.length; i++) { // let fileinfo = fileList[i]; // let path = fileinfo.name; // var reg = /^.*\.(?:xls|xlsx)$/i;//文件名可以带空格 // if (!reg.test(path)) {//校验不通过 // fileList.splice(i); // this.$message({ // showClose: true, // message: "请选择EXCEL文件上传", // type: "error" // }); // } else { // name += path + ";"; // 添加excel名字 // } // } // this.files.visitexcel = fileList; // this.teacherinfo.visitexcel = name; // excel赋值 // }, // //excel文件删除 // visitexcelremove (file, fileList) { // this.files.visitexcel = fileList; // let name = ""; // for (let i = 0; i < fileList.length; i++) { // let fileinfo = fileList[i]; // let path = fileinfo.name; // name += path + ";"; // } // this.teacherinfo.visitexcel = name; // excel赋值 // }, PhotoChange (file, fileList) { let reg = /.+(\.jpg|\.jpeg|\.png)$/i; let photoFile = fileList.pop(); let filename = photoFile.name; let fileSize = photoFile.size / 1024; if (reg.test(filename) && fileSize < 65) { this.files.photo.push(photoFile); this.teacherinfo.photoname = filename; } else { this.$message({ showClose: true, message: "请选择图片上传,图片大小65KB以内", type: "error" }); } }, // 图片上的删除按钮 handleRemove (file) { this.files.photo.shift(); this.teacherinfo.photoname = ''; }, }, mounted () { this.loadAll(); }, } </script> <style scoped > .teacherinfoimport { margin-left: 1%; font-family: '微软雅黑'; font-weight: bold; } .el-form-item { margin-bottom: 1%; } .my-autocomplete li { line-height: normal; padding: 7px; } .my-autocomplete li .name { text-overflow: ellipsis; overflow: hidden; font-size: 90%; padding: 0px; margin: -1%; } .submitClass { position: fixed; top: 15%; right: 8%; font-size: 90%; transition: all 0.2s ease-in; color: #00a2ff; background: #f7f7f7; -webkit-box-shadow: 0 0 30px rgba(0, 0, 0, 0.1); box-shadow: 0 0 30px rgba(0, 0, 0, 0.15); -webkit-transform: translate3d(0, 0px, -2px); transform: translate3d(0, 1px, -2px); padding: 15px; } </style> 上面这部分代码中实现将网页输入的信息清空的代码是哪一部分
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值