billion-admin/src/main/resources/application-druid.yml
@@ -6,9 +6,9 @@ druid: # ä¸»åºæ°æ®æº master: url: jdbc:sqlserver://127.0.0.1:1433;DataBaseName=billion-db-bq url: jdbc:sqlserver://127.0.0.1:1433;DataBaseName=billion-db-064 username: sa password: admin@123 password: 123456 # datasource: # type: com.alibaba.druid.pool.DruidDataSource # driverClassName: com.mysql.cj.jdbc.Driver billion-admin/src/main/resources/application.yml
@@ -141,9 +141,9 @@ capitalMode: false logicDeleteField: del_flag # é»è¾å·²å é¤å¼ logicDeleteValue: "1" logicDeleteValue: '1' # é»è¾æªå é¤å¼ logicNotDeleteValue: "0" logicNotDeleteValue: '0' insertStrategy: NOT_NULL updateStrategy: NOT_NULL @@ -171,6 +171,11 @@ # å¹é 龿¥ urlPatterns: /system/*,/monitor/*,/tool/* tcp: server: ip: 127.0.0.1 port: 1000 kangaroohy: milo: config: billion-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
@@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.billion.generator.mapper.GenTableColumnMapper"> <resultMap type="GenTableColumn" id="GenTableColumnResult"> @@ -29,7 +29,7 @@ <result property="updateTime" column="update_time" /> </resultMap> <sql id="selectGenTableColumnVo"> <sql id="selectGenTableColumnVo"> select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column </sql> @@ -40,72 +40,98 @@ </select> <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult"> select column_name, (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else '0' end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName}) order by ordinal_position </select> SELECT a.name AS column_name, (CASE WHEN a.isnullable = 1 THEN 0 ELSE 1 END) AS is_required, (CASE WHEN ( SELECT COUNT(*) FROM sysobjects WHERE (name IN ( SELECT name FROM sysindexes WHERE (id = a.id) AND (indid IN ( SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid IN (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))) )))) AND (xtype = 'PK') ) > 0 THEN 1 ELSE 0 END) AS is_pk, a.colorder AS sort, isnull(g.[value], ' ') AS column_comment, (CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN 1 ELSE 0 END) AS is_increment, b.name AS column_type FROM syscolumns as a LEFT JOIN systypes b ON a.xtype = b.xusertype INNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <![CDATA[<>]]> 'dtproperties' LEFT JOIN syscomments e ON a.cdefault = e.id LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id LEFT JOIN sys.extended_properties f ON d.id = f.class AND f.minor_id = 0 LEFT JOIN sys.objects h ON a.id = h.object_id LEFT JOIN sys.schemas i ON h.schema_id = i.schema_id WHERE d.name = #{tableName} ORDER BY a.colorder </select> <insert id="insertGenTableColumn" parameterType="GenTableColumn" useGeneratedKeys="true" keyProperty="columnId"> insert into gen_table_column ( <if test="tableId != null and tableId != ''">table_id,</if> <if test="columnName != null and columnName != ''">column_name,</if> <if test="columnComment != null and columnComment != ''">column_comment,</if> <if test="columnType != null and columnType != ''">column_type,</if> <if test="javaType != null and javaType != ''">java_type,</if> <if test="javaField != null and javaField != ''">java_field,</if> <if test="isPk != null and isPk != ''">is_pk,</if> <if test="isIncrement != null and isIncrement != ''">is_increment,</if> <if test="isRequired != null and isRequired != ''">is_required,</if> <if test="isInsert != null and isInsert != ''">is_insert,</if> <if test="isEdit != null and isEdit != ''">is_edit,</if> <if test="isList != null and isList != ''">is_list,</if> <if test="isQuery != null and isQuery != ''">is_query,</if> <if test="queryType != null and queryType != ''">query_type,</if> <if test="htmlType != null and htmlType != ''">html_type,</if> <if test="dictType != null and dictType != ''">dict_type,</if> <if test="sort != null">sort,</if> <if test="createBy != null and createBy != ''">create_by,</if> create_time )values( <if test="tableId != null and tableId != ''">#{tableId},</if> <if test="columnName != null and columnName != ''">#{columnName},</if> <if test="columnComment != null and columnComment != ''">#{columnComment},</if> <if test="columnType != null and columnType != ''">#{columnType},</if> <if test="javaType != null and javaType != ''">#{javaType},</if> <if test="javaField != null and javaField != ''">#{javaField},</if> <if test="isPk != null and isPk != ''">#{isPk},</if> <if test="isIncrement != null and isIncrement != ''">#{isIncrement},</if> <if test="isRequired != null and isRequired != ''">#{isRequired},</if> <if test="isInsert != null and isInsert != ''">#{isInsert},</if> <if test="isEdit != null and isEdit != ''">#{isEdit},</if> <if test="isList != null and isList != ''">#{isList},</if> <if test="isQuery != null and isQuery != ''">#{isQuery},</if> <if test="queryType != null and queryType != ''">#{queryType},</if> <if test="htmlType != null and htmlType != ''">#{htmlType},</if> <if test="dictType != null and dictType != ''">#{dictType},</if> <if test="sort != null">#{sort},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> sysdate() ) <if test="tableId != null and tableId != ''">table_id,</if> <if test="columnName != null and columnName != ''">column_name,</if> <if test="columnComment != null and columnComment != ''">column_comment,</if> <if test="columnType != null and columnType != ''">column_type,</if> <if test="javaType != null and javaType != ''">java_type,</if> <if test="javaField != null and javaField != ''">java_field,</if> <if test="isPk != null and isPk != ''">is_pk,</if> <if test="isIncrement != null and isIncrement != ''">is_increment,</if> <if test="isRequired != null and isRequired != ''">is_required,</if> <if test="isInsert != null and isInsert != ''">is_insert,</if> <if test="isEdit != null and isEdit != ''">is_edit,</if> <if test="isList != null and isList != ''">is_list,</if> <if test="isQuery != null and isQuery != ''">is_query,</if> <if test="queryType != null and queryType != ''">query_type,</if> <if test="htmlType != null and htmlType != ''">html_type,</if> <if test="dictType != null and dictType != ''">dict_type,</if> <if test="sort != null">sort,</if> <if test="createBy != null and createBy != ''">create_by,</if> create_time )values( <if test="tableId != null and tableId != ''">#{tableId},</if> <if test="columnName != null and columnName != ''">#{columnName},</if> <if test="columnComment != null and columnComment != ''">#{columnComment},</if> <if test="columnType != null and columnType != ''">#{columnType},</if> <if test="javaType != null and javaType != ''">#{javaType},</if> <if test="javaField != null and javaField != ''">#{javaField},</if> <if test="isPk != null and isPk != ''">#{isPk},</if> <if test="isIncrement != null and isIncrement != ''">#{isIncrement},</if> <if test="isRequired != null and isRequired != ''">#{isRequired},</if> <if test="isInsert != null and isInsert != ''">#{isInsert},</if> <if test="isEdit != null and isEdit != ''">#{isEdit},</if> <if test="isList != null and isList != ''">#{isList},</if> <if test="isQuery != null and isQuery != ''">#{isQuery},</if> <if test="queryType != null and queryType != ''">#{queryType},</if> <if test="htmlType != null and htmlType != ''">#{htmlType},</if> <if test="dictType != null and dictType != ''">#{dictType},</if> <if test="sort != null">#{sort},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> getdate() ) </insert> <update id="updateGenTableColumn" parameterType="GenTableColumn"> update gen_table_column <set> is_insert = #{isInsert}, is_edit = #{isEdit}, is_list = #{isList}, is_query = #{isQuery}, is_required = #{isRequired}, <if test="columnComment != null">column_comment = #{columnComment},</if> <if test="javaType != null">java_type = #{javaType},</if> <if test="javaField != null">java_field = #{javaField},</if> <if test="isInsert != null">is_insert = #{isInsert},</if> <if test="isEdit != null">is_edit = #{isEdit},</if> <if test="isList != null">is_list = #{isList},</if> <if test="isQuery != null">is_query = #{isQuery},</if> <if test="isRequired != null">is_required = #{isRequired},</if> <if test="queryType != null">query_type = #{queryType},</if> <if test="htmlType != null">html_type = #{htmlType},</if> <if test="dictType != null">dict_type = #{dictType},</if> <if test="sort != null">sort = #{sort},</if> <if test="updateBy != null">update_by = #{updateBy},</if> update_time = sysdate() update_time = getdate() </set> where column_id = #{columnId} </update> billion-generator/src/main/resources/mapper/generator/GenTableMapper.xml
@@ -1,18 +1,17 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.billion.generator.mapper.GenTableMapper"> <resultMap type="GenTable" id="GenTableResult"> <id property="tableId" column="table_id" /> <id property="tableId" column="table_id" /> <result property="tableName" column="table_name" /> <result property="tableComment" column="table_comment" /> <result property="subTableName" column="sub_table_name" /> <result property="subTableFkName" column="sub_table_fk_name" /> <result property="className" column="class_name" /> <result property="tplCategory" column="tpl_category" /> <result property="tplWebType" column="tpl_web_type" /> <result property="packageName" column="package_name" /> <result property="moduleName" column="module_name" /> <result property="businessName" column="business_name" /> @@ -26,39 +25,39 @@ <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> <result property="remark" column="remark" /> <collection property="columns" javaType="java.util.List" resultMap="GenTableColumnResult" /> <collection property="columns" javaType="java.util.List" resultMap="GenTableColumnResult" /> </resultMap> <resultMap type="GenTableColumn" id="GenTableColumnResult"> <id property="columnId" column="column_id" /> <result property="tableId" column="table_id" /> <result property="columnName" column="column_name" /> <result property="columnComment" column="column_comment" /> <result property="columnType" column="column_type" /> <result property="javaType" column="java_type" /> <result property="javaField" column="java_field" /> <result property="isPk" column="is_pk" /> <result property="isIncrement" column="is_increment" /> <result property="isRequired" column="is_required" /> <result property="isInsert" column="is_insert" /> <result property="isEdit" column="is_edit" /> <result property="isList" column="is_list" /> <result property="isQuery" column="is_query" /> <result property="queryType" column="query_type" /> <result property="htmlType" column="html_type" /> <result property="dictType" column="dict_type" /> <result property="sort" column="sort" /> <result property="createBy" column="create_by" /> <result property="createTime" column="create_time" /> <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> </resultMap> <id property="columnId" column="column_id" /> <result property="tableId" column="table_id" /> <result property="columnName" column="column_name" /> <result property="columnComment" column="column_comment" /> <result property="columnType" column="column_type" /> <result property="javaType" column="java_type" /> <result property="javaField" column="java_field" /> <result property="isPk" column="is_pk" /> <result property="isIncrement" column="is_increment" /> <result property="isRequired" column="is_required" /> <result property="isInsert" column="is_insert" /> <result property="isEdit" column="is_edit" /> <result property="isList" column="is_list" /> <result property="isQuery" column="is_query" /> <result property="queryType" column="query_type" /> <result property="htmlType" column="html_type" /> <result property="dictType" column="dict_type" /> <result property="sort" column="sort" /> <result property="createBy" column="create_by" /> <result property="createTime" column="create_time" /> <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> </resultMap> <sql id="selectGenTableVo"> select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table </sql> <select id="selectGenTableList" parameterType="GenTable" resultMap="GenTableResult"> select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table </sql> <select id="selectGenTableList" parameterType="GenTable" resultMap="GenTableResult"> <include refid="selectGenTableVo"/> <where> <if test="tableName != null and tableName != ''"> @@ -68,143 +67,161 @@ AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) </if> <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼å§æ¶é´æ£ç´¢ --> AND date_format(create_time,'%Y%m%d') >= date_format(#{params.beginTime},'%Y%m%d') <!-- and <![CDATA[ create_time >= convert(datetime, #{params.beginTime}, 20)]]>--> and datediff(d, create_time, #{params.beginTime}) <![CDATA[<=]]> 0 </if> <if test="params.endTime != null and params.endTime != ''"><!-- ç»ææ¶é´æ£ç´¢ --> AND date_format(create_time,'%Y%m%d') <= date_format(#{params.endTime},'%Y%m%d') <!-- and <![CDATA[ create_time <= convert(datetime, #{params.endTime}, 20)]]>--> and datediff(d, create_time, #{params.endTime}) <![CDATA[>=]]> 0 </if> </where> </select> <select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult"> select table_name, table_comment, create_time, update_time from information_schema.tables where table_schema = (select database()) AND table_name NOT LIKE 'qrtz\_%' AND table_name NOT LIKE 'gen\_%' AND table_name NOT IN (select table_name from gen_table) SELECT so.name as table_name, sep.value as table_comment, so.create_date as create_time, so.modify_date as update_time FROM sys.objects as so LEFT JOIN sys.extended_properties as sep on so.object_id = sep.major_id WHERE so.type = 'U' AND sep.minor_id = 0 AND so.name NOT LIKE 'qrtz_%' AND so.name NOT LIKE 'gen_%' AND so.name NOT LIKE 'act_%' AND so.name NOT LIKE 'flw_%' AND so.name NOT IN (select table_name from gen_table) <if test="tableName != null and tableName != ''"> AND lower(table_name) like lower(concat('%', #{tableName}, '%')) AND lower(so.name) like lower(concat('%', #{tableName}, '%')) </if> <if test="tableComment != null and tableComment != ''"> AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) AND lower(cast(sep.value as nvarchar)) like lower(concat('%', #{tableComment}, '%')) </if> <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼å§æ¶é´æ£ç´¢ --> AND date_format(create_time,'%Y%m%d') >= date_format(#{params.beginTime},'%Y%m%d') <!-- and <![CDATA[ create_time >= convert(datetime, #{params.beginTime}, 20)]]>--> and datediff(d, so.create_date, #{params.beginTime}) <![CDATA[<=]]> 0 </if> <if test="params.endTime != null and params.endTime != ''"><!-- ç»ææ¶é´æ£ç´¢ --> AND date_format(create_time,'%Y%m%d') <= date_format(#{params.endTime},'%Y%m%d') <!-- and <![CDATA[ create_time <= convert(datetime, #{params.endTime}, 20)]]>--> and datediff(d, so.create_date, #{params.endTime}) <![CDATA[>=]]> 0 </if> order by create_time desc order by so.create_date desc </select> <select id="selectDbTableListByNames" resultMap="GenTableResult"> select table_name, table_comment, create_time, update_time from information_schema.tables where table_name NOT LIKE 'qrtz\_%' and table_name NOT LIKE 'gen\_%' and table_schema = (select database()) and table_name in <foreach collection="array" item="name" open="(" separator="," close=")"> #{name} </foreach> SELECT SO.name table_name, SEP.VALUE table_comment, SO.create_date create_time, SO.modify_date update_time FROM sys.objects AS SO LEFT JOIN sys.extended_properties AS SEP ON SO.object_id = SEP.major_id WHERE SO.type = 'U' AND SEP.minor_id = 0 and SO.name NOT LIKE 'qrtz_%' and SO.name NOT LIKE 'gen_%' AND so.name NOT LIKE 'act_%' AND so.name NOT LIKE 'flw_%' and SO.name in <foreach collection="array" item="name" open="(" separator="," close=")"> #{name} </foreach> </select> <select id="selectTableByName" parameterType="String" resultMap="GenTableResult"> select table_name, table_comment, create_time, update_time from information_schema.tables where table_comment <![CDATA[ <> ]]> '' and table_schema = (select database()) and table_name = #{tableName} and table_name = #{tableName} </select> <select id="selectGenTableById" parameterType="Long" resultMap="GenTableResult"> SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort FROM gen_table t LEFT JOIN gen_table_column c ON t.table_id = c.table_id LEFT JOIN gen_table_column c ON t.table_id = c.table_id where t.table_id = #{tableId} order by c.sort </select> <select id="selectGenTableByName" parameterType="String" resultMap="GenTableResult"> SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort FROM gen_table t LEFT JOIN gen_table_column c ON t.table_id = c.table_id LEFT JOIN gen_table_column c ON t.table_id = c.table_id where t.table_name = #{tableName} order by c.sort </select> <select id="selectGenTableAll" parameterType="String" resultMap="GenTableResult"> SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark, SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark, c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort FROM gen_table t LEFT JOIN gen_table_column c ON t.table_id = c.table_id LEFT JOIN gen_table_column c ON t.table_id = c.table_id order by c.sort </select> <insert id="insertGenTable" parameterType="GenTable" useGeneratedKeys="true" keyProperty="tableId"> insert into gen_table ( <if test="tableName != null">table_name,</if> <if test="tableComment != null and tableComment != ''">table_comment,</if> <if test="className != null and className != ''">class_name,</if> <if test="tplCategory != null and tplCategory != ''">tpl_category,</if> <if test="tplWebType != null and tplWebType != ''">tpl_web_type,</if> <if test="packageName != null and packageName != ''">package_name,</if> <if test="moduleName != null and moduleName != ''">module_name,</if> <if test="businessName != null and businessName != ''">business_name,</if> <if test="functionName != null and functionName != ''">function_name,</if> <if test="functionAuthor != null and functionAuthor != ''">function_author,</if> <if test="genType != null and genType != ''">gen_type,</if> <if test="genPath != null and genPath != ''">gen_path,</if> <if test="remark != null and remark != ''">remark,</if> <if test="createBy != null and createBy != ''">create_by,</if> create_time )values( <if test="tableName != null">#{tableName},</if> <if test="tableComment != null and tableComment != ''">#{tableComment},</if> <if test="className != null and className != ''">#{className},</if> <if test="tplCategory != null and tplCategory != ''">#{tplCategory},</if> <if test="tplWebType != null and tplWebType != ''">#{tplWebType},</if> <if test="packageName != null and packageName != ''">#{packageName},</if> <if test="moduleName != null and moduleName != ''">#{moduleName},</if> <if test="businessName != null and businessName != ''">#{businessName},</if> <if test="functionName != null and functionName != ''">#{functionName},</if> <if test="functionAuthor != null and functionAuthor != ''">#{functionAuthor},</if> <if test="genType != null and genType != ''">#{genType},</if> <if test="genPath != null and genPath != ''">#{genPath},</if> <if test="remark != null and remark != ''">#{remark},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> sysdate() ) </insert> <update id="createTable"> ${sql} </update> <update id="updateGenTable" parameterType="GenTable"> update gen_table <set> <if test="tableName != null">table_name = #{tableName},</if> <if test="tableComment != null and tableComment != ''">table_comment = #{tableComment},</if> <if test="subTableName != null">sub_table_name = #{subTableName},</if> <if test="subTableFkName != null">sub_table_fk_name = #{subTableFkName},</if> <if test="className != null and className != ''">class_name = #{className},</if> <if test="functionAuthor != null and functionAuthor != ''">function_author = #{functionAuthor},</if> <if test="genType != null and genType != ''">gen_type = #{genType},</if> <if test="genPath != null and genPath != ''">gen_path = #{genPath},</if> <if test="tplCategory != null and tplCategory != ''">tpl_category = #{tplCategory},</if> <if test="tplWebType != null and tplWebType != ''">tpl_web_type = #{tplWebType},</if> <if test="packageName != null and packageName != ''">package_name = #{packageName},</if> <if test="moduleName != null and moduleName != ''">module_name = #{moduleName},</if> <if test="businessName != null and businessName != ''">business_name = #{businessName},</if> <if test="functionName != null and functionName != ''">function_name = #{functionName},</if> <if test="options != null and options != ''">options = #{options},</if> <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> <if test="remark != null">remark = #{remark},</if> update_time = sysdate() </set> where table_id = #{tableId} </update> <delete id="deleteGenTableByIds" parameterType="Long"> delete from gen_table where table_id in <foreach collection="array" item="tableId" open="(" separator="," close=")"> #{tableId} </foreach> </delete> insert into gen_table ( <if test="tableName != null">table_name,</if> <if test="tableComment != null and tableComment != ''">table_comment,</if> <if test="className != null and className != ''">class_name,</if> <if test="tplCategory != null and tplCategory != ''">tpl_category,</if> <if test="packageName != null and packageName != ''">package_name,</if> <if test="moduleName != null and moduleName != ''">module_name,</if> <if test="businessName != null and businessName != ''">business_name,</if> <if test="functionName != null and functionName != ''">function_name,</if> <if test="functionAuthor != null and functionAuthor != ''">function_author,</if> <if test="genType != null and genType != ''">gen_type,</if> <if test="genPath != null and genPath != ''">gen_path,</if> <if test="remark != null and remark != ''">remark,</if> <if test="createBy != null and createBy != ''">create_by,</if> create_time )values( <if test="tableName != null">#{tableName},</if> <if test="tableComment != null and tableComment != ''">#{tableComment},</if> <if test="className != null and className != ''">#{className},</if> <if test="tplCategory != null and tplCategory != ''">#{tplCategory},</if> <if test="packageName != null and packageName != ''">#{packageName},</if> <if test="moduleName != null and moduleName != ''">#{moduleName},</if> <if test="businessName != null and businessName != ''">#{businessName},</if> <if test="functionName != null and functionName != ''">#{functionName},</if> <if test="functionAuthor != null and functionAuthor != ''">#{functionAuthor},</if> <if test="genType != null and genType != ''">#{genType},</if> <if test="genPath != null and genPath != ''">#{genPath},</if> <if test="remark != null and remark != ''">#{remark},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> getdate() ) </insert> <update id="updateGenTable" parameterType="GenTable"> update gen_table <set> <if test="tableName != null">table_name = #{tableName},</if> <if test="tableComment != null and tableComment != ''">table_comment = #{tableComment},</if> <if test="subTableName != null">sub_table_name = #{subTableName},</if> <if test="subTableFkName != null">sub_table_fk_name = #{subTableFkName},</if> <if test="className != null and className != ''">class_name = #{className},</if> <if test="functionAuthor != null and functionAuthor != ''">function_author = #{functionAuthor},</if> <if test="genType != null and genType != ''">gen_type = #{genType},</if> <if test="genPath != null and genPath != ''">gen_path = #{genPath},</if> <if test="tplCategory != null and tplCategory != ''">tpl_category = #{tplCategory},</if> <if test="packageName != null and packageName != ''">package_name = #{packageName},</if> <if test="moduleName != null and moduleName != ''">module_name = #{moduleName},</if> <if test="businessName != null and businessName != ''">business_name = #{businessName},</if> <if test="functionName != null and functionName != ''">function_name = #{functionName},</if> <if test="options != null and options != ''">options = #{options},</if> <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> <if test="remark != null">remark = #{remark},</if> update_time = getdate() </set> where table_id = #{tableId} </update> <delete id="deleteGenTableByIds" parameterType="Long"> delete from gen_table where table_id in <foreach collection="array" item="tableId" open="(" separator="," close=")"> #{tableId} </foreach> </delete> </mapper> billion-main/pom.xml
@@ -59,18 +59,24 @@ <artifactId>billion-framework</artifactId> </dependency> <!-- opc start--> <dependency> <groupId>com.kangaroohy</groupId> <artifactId>milo-spring-boot-starter</artifactId> <version>3.0.4</version> <version>3.0.5</version> </dependency> <!-- opc start--> <!-- <dependency>--> <!-- <groupId>com.kangaroohy</groupId>--> <!-- <artifactId>milo-spring-boot-starter</artifactId>--> <!-- <version>3.0.4</version>--> <!-- </dependency>--> <!-- opc end--> <dependency> <groupId>com.billion</groupId> <artifactId>billion-quartz</artifactId> </dependency> <!-- <dependency>--> <!-- <groupId>com.billion</groupId>--> <!-- <artifactId>billion-quartz</artifactId>--> <!-- </dependency>--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> @@ -87,6 +93,11 @@ <artifactId>hutool-all</artifactId> <version>5.8.22</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.22</version> </dependency> </dependencies> </project> billion-main/src/main/java/com/billion/main/api/service/impl/WorkOrdersInfoServiceImpl.java
@@ -43,15 +43,15 @@ omProductionOrderInfo.setWorkOrderNo(workOrdersInfo.getOrderNumber()); omProductionOrderInfo.setSalesOrderCode(workOrdersInfo.getBatchNumber()); omProductionOrderInfo.setProductCode(workOrdersInfo.getMaterialNumber()); omProductionOrderInfo.setEngineType(workOrdersInfo.getEngineType()); omProductionOrderInfo.setEngineName(workOrdersInfo.getEngineName()); // omProductionOrderInfo.setEngineType(workOrdersInfo.getEngineType()); // omProductionOrderInfo.setEngineName(workOrdersInfo.getEngineName()); omProductionOrderInfo.setPlanQty(Long.valueOf(workOrdersInfo.getProductionPlan())); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startTime = sdf.parse(workOrdersInfo.getStartTime()); omProductionOrderInfo.setPlanStartTime(startTime); omProductionOrderInfo.setRemarks(workOrdersInfo.getDescription()); omProductionOrderInfo.setOrderStatus(workOrdersInfo.getState()); omProductionOrderInfo.setFlag(workOrdersInfo.getFLAG()); omProductionOrderInfo.setDelFlag(workOrdersInfo.getFLAG()); omProductionOrderInfoService.save(omProductionOrderInfo); //ä¿åBOMä¸»è¡¨ä¿¡æ¯ BsBomInfo bsBomInfo = new BsBomInfo(); billion-main/src/main/java/com/billion/main/da/controller/DaStationCollectionController.java
@@ -1,18 +1,34 @@ package com.billion.main.da.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.billion.common.annotation.Log; import com.billion.common.core.controller.BaseController; import com.billion.common.core.domain.AjaxResult; import com.billion.common.core.domain.R; import com.billion.common.core.page.TableDataInfo; import com.billion.common.enums.BusinessType; import com.billion.common.exception.ServiceException; import com.billion.common.utils.poi.ExcelUtil; import com.billion.main.da.domain.DaStationCollection; import com.billion.main.da.service.IDaStationCollectionService; import com.billion.main.da.service.impl.DaStationCollectionServiceImpl; import com.billion.main.plc.constant.Constants; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.service.MiloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.rmi.ServerError; import java.util.ArrayList; import java.util.Date; import java.util.List; /** @@ -26,7 +42,10 @@ public class DaStationCollectionController extends BaseController { @Autowired private IDaStationCollectionService daStationCollectionService; private DaStationCollectionServiceImpl daStationCollectionService; @Resource private MiloService miloService; /** * æ¥è¯¢è¿ç«ééå表 @@ -38,6 +57,13 @@ startPage(); List<DaStationCollection> list = daStationCollectionService.selectDaStationCollectionList(daStationCollection); return getDataTable(list); } @GetMapping("/printList") public R printList() { List<DaStationCollection> list = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>().eq(DaStationCollection::getStatus,"0")); return R.ok(list); } /** @@ -90,9 +116,149 @@ */ @PreAuthorize("@ss.hasPermi('da:stationCollection:remove')") @Log(title = "è¿ç«éé", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) @DeleteMapping("/{id}") public R remove(@PathVariable Long id) { return toAjax(daStationCollectionService.deleteDaStationCollectionByIds(ids)); if (ObjUtil.isNull(id)){ throw new ServiceException("idä¸è½ä¸ºç©º"); } List<DaStationCollection> list = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>().eq(DaStationCollection::getId, id)); if (CollUtil.isEmpty(list)){ throw new ServiceException("æ°æ®ä¸åå¨ï¼è¯·å·æ°åéè¯"); } daStationCollectionService.removeById(id); return R.ok(); } @GetMapping("/crave") public R crave(String sfcCode) throws IOException { if (StrUtil.isBlank(sfcCode)){ throw new ServiceException("åºåå·ä¸è½ä¸ºç©º"); } if (!sfcCode.contains(StrUtil.SPACE)){ throw new ServiceException("è¾å ¥çåºåå·éè¦å å«ç©ºæ ¼ï¼"); } List<DaStationCollection> list = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>() .eq(DaStationCollection::getSfcCode, sfcCode) .eq(DaStationCollection::getLocationCode,"OP001")); if (CollUtil.isNotEmpty(list)){ DaStationCollection daStationCollection = list.get(0); //éå¤å»ç return R.ok(303,"æ¤åºåå·å·²å»ç "); } else { // //馿¬¡å»ç -åéå»ç ä¿¡å·ç»ä¸ä½æº // TcpClient tcpClient = new TcpClient(); // byte[] bytes = sfcCode.getBytes(StandardCharsets.UTF_8); // tcpClient.sendData(bytes); //æ¥è¯¢æ°æ®ä¸ç¶æä¸º0çæ°æ® List<DaStationCollection> collect = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>() .eq(DaStationCollection::getStatus, "0")); if (CollUtil.isNotEmpty(collect)) { //æ¸ é¤ daStationCollectionService.update(new LambdaUpdateWrapper<DaStationCollection>() .eq(DaStationCollection::getStatus,"0") .set(DaStationCollection::getStatus,"1")); } //ä¿åæ°æ® DaStationCollection daStationCollection = new DaStationCollection(); Date date = new Date(); daStationCollection.setSfcCode(sfcCode); List<String> split = ListUtil.toList(sfcCode.split(StrUtil.SPACE)); if (CollUtil.isNotEmpty(split)){ if (split.size() > 1){ daStationCollection.setPrintCode(split.get(1)); } } daStationCollection.setLocationCode("OP001"); daStationCollection.setCollectTime(date); daStationCollection.setInboundTime(date); daStationCollection.setOutboundTime(date); daStationCollection.setStatus("0"); daStationCollectionService.save(daStationCollection); return R.ok(200); } } @GetMapping("/reCrave") public R reCrave(String sfcCode) throws IOException { if (StrUtil.isBlank(sfcCode)){ throw new ServiceException("åºåå·ä¸è½ä¸ºç©º"); } if (!sfcCode.contains(StrUtil.SPACE)){ throw new ServiceException("è¾å ¥çåºåå·éè¦å å«ç©ºæ ¼ï¼"); } // //åéå»ç ä¿¡å·ç»ä¸ä½æº // TcpClient tcpClient = new TcpClient(); // byte[] bytes = sfcCode.getBytes(StandardCharsets.UTF_8); // tcpClient.sendData(bytes); List<DaStationCollection> collect = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>() .eq(DaStationCollection::getStatus, "0")); if (CollUtil.isNotEmpty(collect)) { //æ¸ é¤ daStationCollectionService.update(new LambdaUpdateWrapper<DaStationCollection>() .eq(DaStationCollection::getStatus,"0") .set(DaStationCollection::getStatus,"1")); } //ä¿åæ°æ® DaStationCollection daStationCollection = new DaStationCollection(); Date date = new Date(); daStationCollection.setSfcCode(sfcCode); List<String> split = ListUtil.toList(sfcCode.split(StrUtil.SPACE)); if (CollUtil.isNotEmpty(split)){ if (split.size() > 1){ daStationCollection.setPrintCode(split.get(1)); } } daStationCollection.setLocationCode("OP001"); daStationCollection.setCollectTime(date); daStationCollection.setInboundTime(date); daStationCollection.setOutboundTime(date); daStationCollection.setStatus("0"); daStationCollectionService.save(daStationCollection); return R.ok(200); } @GetMapping("/addPassStationCollection") public R addPassStationCollection(String SNCode, String LocationCode) throws Exception { if (StrUtil.isBlank(SNCode)){ return R.fail("åºåå·ä¸è½ä¸ºç©º"); } if (!SNCode.contains(" ")){ return R.fail("è¯·æ£æ¥åºåå·æ¯å¦æ£ç¡®"); } DaStationCollection daStationCollection = new DaStationCollection(); Date date = new Date(); daStationCollection.setSfcCode(SNCode); daStationCollection.setLocationCode(LocationCode); daStationCollection.setCollectTime(date); daStationCollection.setInboundTime(date); daStationCollection.setOutboundTime(date); daStationCollection.setStatus(Constants.ZERO); daStationCollectionService.save(daStationCollection); if (Constants.OP010.equals(LocationCode)){ //ä¼ å ¥SNCodeå°PLC miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(Constants.OP010_SNCODE1).value(SNCode).build()); } return R.ok(); } // @GetMapping("/testSend") // public void test(){ // TcpClient tcpClient = new TcpClient(); // tcpClient.receiveData(); // } } billion-main/src/main/java/com/billion/main/da/domain/DaStationCollection.java
@@ -48,4 +48,7 @@ private Date collectTime; private String printCode; } billion-main/src/main/java/com/billion/main/da/service/impl/DaStationCollectionServiceImpl.java
@@ -58,7 +58,7 @@ @Override public int insertDaStationCollection(DaStationCollection daStationCollection) { return daStationCollectionMapper.insertDaStationCollection(daStationCollection); return daStationCollectionMapper.insert(daStationCollection); } /** billion-main/src/main/java/com/billion/main/om/controller/OmProductionOrderInfoController.java
@@ -1,5 +1,6 @@ package com.billion.main.om.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.billion.common.annotation.Log; import com.billion.common.core.controller.BaseController; import com.billion.common.core.domain.AjaxResult; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @@ -103,4 +105,16 @@ { return toAjax(OmProductionOrderInfoService.deleteOmProductionOrderInfoByIds(ids)); } @PreAuthorize("@ss.hasPermi('main:info:list')") @GetMapping("/getTodayList") public R getTodayList() { LocalDate today = LocalDate.now(); List<OmProductionOrderInfo> list = OmProductionOrderInfoService.list(new LambdaQueryWrapper<OmProductionOrderInfo>() .eq(OmProductionOrderInfo::getPlanStartTime,today)); return R.ok(list); } } billion-main/src/main/java/com/billion/main/om/domain/OmProductionOrderInfo.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.billion.common.annotation.Excel; import com.billion.main.common.BaseEntity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -14,18 +15,15 @@ * @date 2024-11-20 */ @Data public class OmProductionOrderInfo public class OmProductionOrderInfo extends BaseEntity { @TableId /** 主é®id */ private Long id; /** å·¥åç¼å· */ @Excel(name = "å·¥åç¼å·") // @Excel(name = "å·¥åç¼å·") private String workOrderNo; /** 订åç¼å· */ @Excel(name = "订åç¼å·") // @Excel(name = "订åç¼å·") private String salesOrderCode; /** 产åç¼å· */ @@ -33,7 +31,7 @@ private String productCode; /** 产线ç¼å· */ @Excel(name = "产线ç¼å·") // @Excel(name = "产线ç¼å·") private String lineCode; /** è®¡åæ°é */ @@ -41,46 +39,31 @@ private Long planQty; /** 计åå¼å§æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "计åå¼å§æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "计åå¼å§æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") private Date planStartTime; /** 计åç»ææ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "计åç»ææ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") // @Excel(name = "计åç»ææ¶é´", width = 30, dateFormat = "yyyy-MM-dd") private Date planEndTime; /** å·¥åç¶æï¼1æªå¼å§2ç产ä¸3已宿4å·²å ³éï¼ */ @Excel(name = "å·¥åç¶æ", readConverterExp = "1=æªå¼å§,2=ç产ä¸,3=已宿,4=å·²å ³é") // @Excel(name = "å·¥åç¶æ", readConverterExp = "1=æªå¼å§,2=ç产ä¸,3=已宿,4=å·²å ³é") private String orderStatus; /** 夿³¨ */ @Excel(name = "夿³¨") private String remarks; /** å卿ºåå· */ @Excel(name = "å卿ºåå·") private String engineType; // /** å卿ºåå· */ // @Excel(name = "å卿ºåå·") // private String engineType; // // /** æºå */ // @Excel(name = "æºå") // private String engineName; /** æºå */ @Excel(name = "æºå") private String engineName; /** 订åç¶æ */ @Excel(name = "订åç¶æ") private String flag; /** å建è */ private String createBy; /** å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** æ´æ°è */ private String updateBy; /** æ´æ°æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; } billion-main/src/main/java/com/billion/main/om/service/impl/OmProductionOrderInfoServiceImpl.java
@@ -1,6 +1,7 @@ package com.billion.main.om.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.billion.common.core.domain.entity.SysUser; @@ -84,20 +85,20 @@ @Override public int updateOmProductionOrderInfo(OmProductionOrderInfo omProductionOrderInfo) { Collection<Long> omProductionOrderInfoIds = Collections.emptyList(); List<OmProductionOrderInfo> checkList = this.list(new LambdaQueryWrapper<OmProductionOrderInfo>() .eq(OmProductionOrderInfo::getWorkOrderNo, omProductionOrderInfo.getWorkOrderNo()) .notIn(OmProductionOrderInfo::getId, omProductionOrderInfoIds)); // .stream().filter(x -> !x.getId().equals(omProductionOrderInfo.getId())) // .collect(Collectors.toList()); if (CollUtil.isNotEmpty(checkList)){ throw new ServiceException("å·²åå¨å·¥åç¼å·ä¸º"+omProductionOrderInfo.getWorkOrderNo()+"çæ°æ®"); } LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser user = loginUser.getUser(); omProductionOrderInfo.setUpdateTime(new Date()); omProductionOrderInfo.setUpdateBy(user.getUserName()); return OmProductionOrderInfoMapper.updateOmProductionOrderInfo(omProductionOrderInfo); // Collection<Long> omProductionOrderInfoIds = Collections.emptyList(); // List<OmProductionOrderInfo> checkList = this.list(new LambdaQueryWrapper<OmProductionOrderInfo>() // .eq(OmProductionOrderInfo::getWorkOrderNo, omProductionOrderInfo.getWorkOrderNo()) // .notIn(OmProductionOrderInfo::getId, omProductionOrderInfoIds)); //// .stream().filter(x -> !x.getId().equals(omProductionOrderInfo.getId())) //// .collect(Collectors.toList()); // if (CollUtil.isNotEmpty(checkList)){ // throw new ServiceException("å·²åå¨å·¥åç¼å·ä¸º"+omProductionOrderInfo.getWorkOrderNo()+"çæ°æ®"); // } // LoginUser loginUser = SecurityUtils.getLoginUser(); // SysUser user = loginUser.getUser(); // omProductionOrderInfo.setUpdateTime(new Date()); // omProductionOrderInfo.setUpdateBy(user.getUserName()); return OmProductionOrderInfoMapper.updateById(omProductionOrderInfo); } /** billion-main/src/main/java/com/billion/main/plc/CustomRunner.java
@@ -10,12 +10,14 @@ import com.billion.main.sc.domain.ScOpcConf; import com.billion.main.sc.service.IScCollectionParamConfService; import com.billion.main.sc.service.IScOpcConfService; import com.billion.system.service.impl.SysNoticeServiceImpl; import com.kangaroohy.milo.service.MiloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; @@ -33,6 +35,9 @@ @Autowired private IDaStationCollectionService stationCollectionService; @Resource private SysNoticeServiceImpl sysNoticeService; @Override public void run(ApplicationArguments args) throws Exception { @@ -40,7 +45,8 @@ miloService, collectionParamConfService, paramCollectionService, stationCollectionService); stationCollectionService, sysNoticeService); List<String> lists = getSubList(); System.out.println("订é å 容ï¼"+lists); billion-main/src/main/java/com/billion/main/plc/constant/Constants.java
@@ -40,9 +40,13 @@ public static final String STRING_TWO_THREE= "23"; public static final Integer INTEGER_ONE_ONE= 11; public static final Integer INTEGER_ONE_TWO= 12; public static final Integer INTEGER_TWO_ONE= 21; public static final Integer INTEGER_TWO_FIVE= 25; public static final Integer INTEGER_TWO_THREE= 23; public static final String OP010_SNCODE1 = "OP010.OP010.SNCode1"; public static final Integer USE_ING= 0; @@ -56,6 +60,9 @@ public static final String ONE= "1"; public static final String ZERO= "0"; public static final String TWO= "2"; public static final String THREE = "3"; public static final String FOUR= "4"; public static final String FIVE= "5"; public static final String OP010= "OP010"; public static final String OP020= "OP020"; billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java
@@ -2,18 +2,24 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONUtil; import com.alibaba.druid.sql.visitor.functions.Substring; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.billion.main.api.domain.StationST180; import com.billion.main.da.domain.DaParamCollection; import com.billion.main.da.domain.DaStationCollection; import com.billion.main.da.service.IDaParamCollectionService; import com.billion.main.da.service.IDaStationCollectionService; import com.billion.main.plc.constant.Constants; import com.billion.main.sc.domain.ScCollectionParamConf; import com.billion.main.sc.service.IScCollectionParamConfService; import com.billion.system.domain.SysNotice; import com.billion.system.service.impl.SysNoticeServiceImpl; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; import com.kangaroohy.milo.service.MiloService; @@ -38,19 +44,23 @@ public static IDaParamCollectionService paramCollectionService; public static IDaStationCollectionService stationCollectionService; public static SysNoticeServiceImpl sysNoticeService; public OPCUaSubscription(MiloService miloService, IScCollectionParamConfService collectionParamConfService ,IDaParamCollectionService paramCollectionService,IDaStationCollectionService stationCollectionService) { ,IDaParamCollectionService paramCollectionService,IDaStationCollectionService stationCollectionService,SysNoticeServiceImpl sysNoticeService) { OPCUaSubscription.miloService = miloService; OPCUaSubscription.collectionParamConfService = collectionParamConfService; OPCUaSubscription.paramCollectionService = paramCollectionService; OPCUaSubscription.stationCollectionService = stationCollectionService; OPCUaSubscription.sysNoticeService = sysNoticeService; } @Override public void onSubscribe(String identifier, Object value) { log.info("å°åï¼"+identifier+"å¼ï¼"+value); try { if(null != value && !Constants.ZERO.equals(value.toString())) { if(ObjUtil.isNotNull(value) && !Constants.ZERO.equals(value.toString())) { String[] nodes = identifier.split("[.]"); String thoroughfare = nodes[0];//éé String device = nodes[1];//è®¾å¤ @@ -71,12 +81,66 @@ try{ //çå¬recordData if(tab.equals(Constants.RECORD_DATA)){ //妿æ¯2ååºç«å¤ç if(valueString.equals(Constants.TWO)){ if(valueString.equals(Constants.ONE)){ // Object StationStatusObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus").getValue(); // if (ObjUtil.isNotNull(StationStatusObject)){ // String StationStatus = StationStatusObject.toString(); // if (!Constants.ONE.equals(StationStatus)){ // miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.INTEGER_ONE_TWO).build()); // } else { // miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.INTEGER_ONE_ONE).build()); // } // } miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.INTEGER_ONE_ONE).build()); } else if(valueString.equals(Constants.TWO)){ //妿æ¯2ååºç«å¤ç Object SNCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".SNCode").getValue(); if (ObjUtil.isNotNull(SNCodeObject)){ String SnCode = SNCodeObject.toString(); if (StrUtil.isNotBlank(SnCode)){ savePassingStation(thoroughfare,device,"snCode"); saveParamCollection(device, "snCode", "stationStatus"); } } Integer result = Constants.INTEGER_TWO_ONE; result = saveParamCollection(device, "snCode", "stationStatus"); miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build()); } } else if (tab.startsWith("OP")){ //å¤çè®¾å¤æ¥è¦ if (Constants.FIVE.equals(valueString)){ //éç½® List<SysNotice> list = sysNoticeService.list(new LambdaQueryWrapper<SysNotice>() .eq(SysNotice::getNoticeTitle, tab) .eq(SysNotice::getStatus, Constants.ONE) .eq(SysNotice::getNoticeType,valueString)); if (CollUtil.isNotEmpty(list)){ list.forEach(x ->{ x.setStatus(Constants.ZERO); }); sysNoticeService.updateBatchById(list); } } else { SysNotice sysNotice = new SysNotice(); sysNotice.setNoticeTitle(tab); sysNotice.setNoticeType(valueString); String type = ""; if (Constants.ONE.equals(valueString)){ type = "缺æ"; } else if (Constants.TWO.equals(valueString)){ type = "æ é"; } else if (Constants.THREE.equals(valueString)){ type = "设å¤"; } else if (Constants.FOUR.equals(valueString)){ type = "æ¥å"; } String content = tab + "å·¥ä½" +type+ "æ¥è¦"; sysNotice.setNoticeContent(content); sysNotice.setStatus(Constants.ONE); sysNoticeService.insertNotice(sysNotice); } } }catch (Exception e) { log.error(e.getMessage()); @@ -91,16 +155,23 @@ * @return Integer * @throws Exception e */ private static Integer savePassingStation(String device, String snCode,String stationStatus){ Integer result = 21; private static void savePassingStation(String thoroughfare, String device, String snCode){ try { DaStationCollection daStationCollection = new DaStationCollection(); daStationCollection.setSfcCode(snCode); daStationCollection.setLocationCode(device); daStationCollection.setInboundTime(new Date()); daStationCollection.setOutboundTime(new Date()); Object StationStatusObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus").getValue(); if (ObjUtil.isNotNull(StationStatusObject)){ String StationStatus = StationStatusObject.toString(); daStationCollection.setStatus(StationStatus); } daStationCollection.setCollectTime(new Date()); stationCollectionService.insertDaStationCollection(daStationCollection); } catch (Exception e) { throw new RuntimeException(e); } return result; } /** @@ -111,8 +182,7 @@ * @return result * @throws Exception e */ private static Integer saveParamCollection(String device, String snCode, String stationStatus) { Integer result = Constants.INTEGER_TWO_ONE; private static void saveParamCollection(String device, String snCode, String stationStatus) { try { // æ¥è¯¢åæ°é 置表 List<ScCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<ScCollectionParamConf>() @@ -120,37 +190,36 @@ .eq(ScCollectionParamConf::getSubscribe, Constants.ONE) .orderByDesc(ScCollectionParamConf::getOrderNum) ); if (CollUtil.isNotEmpty(list)) { // è·ååæ°å¼ List<String> collect = list.stream() .map(ScCollectionParamConf::getNode) .collect(Collectors.toList()); List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(collect); // ä¿åééæ°æ® saveCollectionData(device, snCode, list, readWriteEntityList); // å建工ä½å¯¹è±¡å¹¶èµå¼ Object stationObject = createStationObject(device, list, readWriteEntityList); if (stationObject != null) { System.out.println("å·¥ä½" + device + "对象å建æåï¼" + stationObject); // è¿éå¯ä»¥å¯¹å建ç对象è¿è¡è¿ä¸æ¥å¤ç handleMesRequest(stationObject, device); } // // å建工ä½å¯¹è±¡å¹¶èµå¼ // Object stationObject = createStationObject(device, list, readWriteEntityList); // if (stationObject != null) { // System.out.println("å·¥ä½" + device + "对象å建æåï¼" + stationObject); // // è¿éå¯ä»¥å¯¹å建ç对象è¿è¡è¿ä¸æ¥å¤ç // // } } } catch (Exception e) { log.error("ä¿åæ°æ®å¼å¸¸", e); throw new RuntimeException("ä¿åæ°æ®åéå·¥åMESå¼å¸¸"); throw new RuntimeException("ä¿åæ°æ®å¼å¸¸"); } return result; } /** * ä¿åééæ°æ® */ private static void saveCollectionData(String device, String snCode, private static void saveCollectionData(String device, String snCode, List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) { ArrayList<DaParamCollection> collectionList = new ArrayList<>(); for (int i = 0; i < readWriteEntityList.size(); i++) { @@ -169,7 +238,7 @@ /** * å建工ä½å¯¹è±¡å¹¶èµå¼ */ private static Object createStationObject(String device, private static Object createStationObject(String device, List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) { try { // æå»ºå®æ´çç±»å @@ -179,11 +248,11 @@ // è·åææå±æ§ Field[] fields = stationClass.getDeclaredFields(); // åå»ºåæ°å¼Mapï¼æ¹ä¾¿æ¥æ¾ Map<String, String> paramValueMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { paramValueMap.put(list.get(i).getParamCode(), paramValueMap.put(list.get(i).getParamCode(), readWriteEntityList.get(i).getValue().toString()); } @@ -192,7 +261,7 @@ field.setAccessible(true); String paramCode = field.getName(); // åè®¾å±æ§åä¸åæ°ç¼ç ä¸è´ String value = paramValueMap.get(paramCode); if (value != null) { // æ ¹æ®å段类å转æ¢å¼ Object convertedValue = convertValue(value, field.getType()); @@ -232,55 +301,6 @@ } } return value; } private static void handleMesRequest(Object stationObject, String device) { try { // åéHTTPè¯·æ± HttpResponse response = HttpRequest.post(Constants.SY_MES_URL) .body(JSONUtil.toJsonStr(stationObject)) .timeout(5000) // è®¾ç½®è¶ æ¶æ¶é´ .execute(); // è§£æååº if (response.isOk()) { // è¯·æ±æå JSONObject jsonResponse = JSONUtil.parseObj(response.body()); String message = jsonResponse.getStr("message"); if (!"ok".equals(message)) { // ååºä¸æ¯okï¼ä¿åå¤±è´¥è®°å½ saveMesFailRecord(stationObject, device, "ååºå¼å¸¸ï¼" + message); } } else { // HTTP请æ±å¤±è´¥ï¼ä¿åå¤±è´¥è®°å½ saveMesFailRecord(stationObject, device, "HTTPç¶æç ï¼" + response.getStatus()); } } catch (Exception e) { // åçå¼å¸¸ï¼æ¯å¦è¿æ¥è¶ æ¶ãæå¡ä¸å¯ç¨çï¼ï¼ä¿åå¤±è´¥è®°å½ saveMesFailRecord(stationObject, device, "请æ±å¼å¸¸ï¼" + e.getMessage()); } } /** * ä¿åMESæ¨éå¤±è´¥è®°å½ */ private static void saveMesFailRecord(Object stationObject, String device, String errorMsg) { try { MesFailRecord failRecord = new MesFailRecord(); failRecord.setDeviceCode(device); failRecord.setRequestData(JSONUtil.toJsonStr(stationObject)); failRecord.setErrorMsg(errorMsg); failRecord.setCreateTime(new Date()); failRecord.setStatus(0); // 0:æªå¤ç 1:å·²å¤ç failRecord.setRetryCount(0); // éè¯æ¬¡æ° // ä¿åå°æ°æ®åº mesFailRecordService.save(failRecord); log.error("MESæ¨é失败ï¼å·²ä¿å失败记å½ã设å¤ï¼{}ï¼é误ï¼{}", device, errorMsg); } catch (Exception e) { log.error("ä¿åMESå¤±è´¥è®°å½æ¶åçé误", e); } } } billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscriptionTemp.java
ÎļþÒÑɾ³ý billion-main/src/main/java/com/billion/main/tcp/TcpClient.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,134 @@ //package com.billion.main.tcp; // //import cn.hutool.core.collection.CollUtil; //import cn.hutool.core.util.ObjUtil; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; //import com.billion.main.da.domain.DaStationCollection; //import com.billion.main.da.service.impl.DaStationCollectionServiceImpl; //import lombok.extern.slf4j.Slf4j; //import org.springframework.beans.factory.annotation.Value; //import org.springframework.scheduling.annotation.Async; //import org.springframework.stereotype.Component; // //import javax.annotation.PostConstruct; //import javax.annotation.Resource; //import java.io.IOException; //import java.io.InputStream; //import java.io.OutputStream; //import java.net.InetAddress; //import java.net.ServerSocket; //import java.net.Socket; //import java.net.UnknownHostException; //import java.util.Arrays; //import java.util.List; //import java.nio.charset.StandardCharsets; // ///** // * ç®ä»è¯´æ:TCPè¿æ¥ // * // * @author: Eric // * @date: 2025-03-29 13:29:01 // * @version: 1.0 // */ //@Slf4j //@Component //public class TcpClient { // // private Socket socket; // private InputStream input; // private OutputStream output; // // @Value("${tcp.server.ip}") // private String serverIp; // // @Value("${tcp.server.port}") // private int serverPort; // // @Resource // private DaStationCollectionServiceImpl daStationCollectionService; // // @PostConstruct // public void init() throws UnknownHostException { // // try { // log.info("å¼å§å»ºç«è¿æ¥"); // // å»ºç« TCP è¿æ¥ // socket = new Socket(serverIp, serverPort); // int localPort = socket.getLocalPort(); // InetAddress localAddress = socket.getLocalAddress(); // log.info("localPort",localPort); // log.info("localAddress",localAddress); // int port = socket.getPort(); // log.info("port:",port); // input = socket.getInputStream(); // output = socket.getOutputStream(); // log.info("input:",input); // log.info("output:",output); // } catch (IOException e) { // e.printStackTrace(); // } // } // // // åéæ°æ®å°ä¸ä½æº // public void sendData(byte[] data) throws IOException { // output.write(data); // output.flush(); // } // // // æ¥æ¶ä¸ä½æºæ°æ®ï¼æç»çå¬ï¼ // @Async // public void receiveData() { // log.info("æ¥æ¶æ°æ®å¾ªç¯"); // byte[] buffer = new byte[1024]; // if (ObjUtil.isNotNull(socket)){ // while (!socket.isClosed()) { // try { // log.info("å¼å§æ¥æ¶æ°æ®"); // int len = input.read(buffer); // if (len > 0) { // byte[] received = Arrays.copyOf(buffer, len); // String str = new String(received, "UTF-8"); // System.out.println(str); // log.info("æ¥æ¶å°æ°æ®ï¼",str); //// processData(received); // å¤çæ°æ® // List<DaStationCollection> collect = daStationCollectionService.list(new LambdaQueryWrapper<DaStationCollection>() // .eq(DaStationCollection::getStatus, "0")); // if (CollUtil.isNotEmpty(collect)) { // DaStationCollection daStationCollection = collect.get(0); // String sfcCode = daStationCollection.getSfcCode(); // TcpClient tcpClient = new TcpClient(); // byte[] bytes = sfcCode.getBytes(StandardCharsets.UTF_8); // tcpClient.sendData(bytes); // log.info("åéæ°æ®ï¼",sfcCode); // log.info("åéæ°æ®-byteï¼",bytes); // //æ¸ é¤ // daStationCollectionService.update(new LambdaUpdateWrapper<DaStationCollection>() // .eq(DaStationCollection::getSfcCode,sfcCode) // .set(DaStationCollection::getStatus,"1")); // } // } // } catch (IOException e) { // e.printStackTrace(); // closeConnection(); // } // } // } // // } // //// private void processData(byte[] data) { //// // è§£ææ°æ®ï¼å¦ Modbus TCP åè®®ï¼ //// System.out.println("Received: " + HexUtils.bytesToHex(data)); //// } // // public void closeConnection() { // try { // input.close(); // output.close(); // socket.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } //} billion-main/src/main/resources/mapper/om/OmProductionOrderInfoMapper.xml
@@ -33,13 +33,14 @@ <if test="salesOrderCode != null and salesOrderCode != ''"> and sales_order_code = #{salesOrderCode}</if> <if test="productCode != null and productCode != ''"> and product_code = #{productCode}</if> <if test="orderStatus != null and orderStatus != ''"> and order_status = #{orderStatus}</if> and del_flag = "0" and del_flag = '0' </where> order by update_time desc </select> <select id="selectOmProductionOrderInfoById" parameterType="Long" resultMap="OmProductionOrderInfoResult"> <include refid="selectOmProductionOrderInfoVo"/> where id = #{id} and del_flag = "0" where id = #{id} and del_flag = '0' </select> <insert id="insertOmProductionOrderInfo" parameterType="OmProductionOrderInfo" useGeneratedKeys="true" keyProperty="id"> @@ -100,11 +101,11 @@ </update> <update id="deleteOmProductionOrderInfoById" parameterType="Long"> update om_production_order_info set del_flag = "1" where id = #{id} update om_production_order_info set del_flag = '1' where id = #{id} </update> <update id="deleteOmProductionOrderInfoByIds" parameterType="String"> update om_production_order_info set del_flag = "1" where id in update om_production_order_info set del_flag = '1' where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> billion-quartz/pom.xml
@@ -34,6 +34,10 @@ <groupId>com.billion</groupId> <artifactId>billion-common</artifactId> </dependency> <dependency> <groupId>com.billion</groupId> <artifactId>billion-main</artifactId> </dependency> </dependencies> billion-quartz/src/main/java/com/billion/quartz/task/RyTask.java
@@ -1,7 +1,10 @@ package com.billion.quartz.task; import org.springframework.stereotype.Component; import com.billion.common.utils.StringUtils; import javax.annotation.Resource; /** * 宿¶ä»»å¡è°åº¦æµè¯ @@ -11,6 +14,10 @@ @Component("ryTask") public class RyTask { // @Resource // private TcpClient tcpClient; public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { System.out.println(StringUtils.format("æ§è¡å¤åæ¹æ³ï¼ å符串类å{}ï¼å¸å°ç±»å{}ï¼é¿æ´å{}ï¼æµ®ç¹å{}ï¼æ´å½¢{}", s, b, l, d, i)); @@ -24,5 +31,6 @@ public void ryNoParams() { System.out.println("æ§è¡æ åæ¹æ³"); // tcpClient.receiveData(); } } billion-quartz/src/main/java/com/billion/quartz/util/AbstractQuartzJob.java
@@ -93,7 +93,7 @@ } // åå ¥æ°æ®åºå½ä¸ SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); // SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); } /** billion-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml
@@ -87,7 +87,7 @@ <if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if> <if test="status != null and status != ''">#{status},</if> <if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if> sysdate() GETDATE() ) </insert> billion-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml
@@ -75,7 +75,7 @@ <if test="status !=null">status = #{status},</if> <if test="remark != null and remark != ''">remark = #{remark},</if> <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> update_time = sysdate() update_time = GETDATE() </set> where job_id = #{jobId} </update> @@ -104,7 +104,7 @@ <if test="status != null and status != ''">#{status},</if> <if test="remark != null and remark != ''">#{remark},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> sysdate() GETDATE() ) </insert> billion-system/src/main/java/com/billion/system/mapper/SysNoticeMapper.java
@@ -1,6 +1,8 @@ package com.billion.system.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.billion.system.domain.SysNotice; /** @@ -8,7 +10,7 @@ * * @author ruoyi */ public interface SysNoticeMapper public interface SysNoticeMapper extends BaseMapper<SysNotice> { /** * æ¥è¯¢å ¬åä¿¡æ¯ billion-system/src/main/java/com/billion/system/service/impl/SysNoticeServiceImpl.java
@@ -1,6 +1,9 @@ package com.billion.system.service.impl; import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.billion.system.domain.SysNotice; @@ -13,7 +16,7 @@ * @author ruoyi */ @Service public class SysNoticeServiceImpl implements ISysNoticeService public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper,SysNotice> implements ISysNoticeService { @Autowired private SysNoticeMapper noticeMapper; billion-ui/src/api/main/da/stationCollection.js
@@ -8,7 +8,14 @@ params: query }) } export function printList(query) { return request({ url: '/da/stationCollection/printList', method: 'get', params: query }) } printList // æ¥è¯¢è¿ç«ééè¯¦ç» export function getStationCollection(id) { return request({ @@ -42,3 +49,35 @@ method: 'delete' }) } export function crave(param) { return request({ url: '/da/stationCollection/crave', method: 'get', params: param }) } export function reCrave(param) { return request({ url: '/da/stationCollection/reCrave', method: 'get', params: param }) } export function getWelcomeWord(dictType) { return request({ url: '/system/dict/data/type/'+dictType, method: 'get', }) } export function addPassStationCollection(param) { return request({ url: '/da/stationCollection/addPassStationCollection', method: 'get', params: param }) } billion-ui/src/api/main/om/info.js
@@ -9,6 +9,13 @@ }) } export function getTodayList() { return request({ url: '/main/info/getTodayList', method: 'get', }) } export function getOrderList() { return request({ url: '/main/info/getOrderList', billion-ui/src/assets/logo/logo.pngbillion-ui/src/assets/logo/logo2.png
billion-ui/src/router/index.js
@@ -62,9 +62,9 @@ hidden: true }, { path: '/', path: '', component: Layout, redirect: '/index', redirect: 'index', children: [ { path: 'index', @@ -89,24 +89,24 @@ ] }, // æ ·æºæ ç¾æå°è·¯ç± { path: '/main/bq', component: Layout, children: [ { path: 'prototypeLabelPrinting', component: () => import('@/views/main/bq/prototypeLabelPrinting'), name: 'PrototypeLabelPrinting', meta: { title: 'æ ·æºæ ç¾æå°', icon: 'printer' } } ] }, // { // path: '/main/bq', // component: Layout, // children: [ // { // path: 'prototypeLabelPrinting', // component: () => import('@/views/main/bq/prototypeLabelPrinting'), // name: 'PrototypeLabelPrinting', // meta: { title: 'æ ·æºæ ç¾æå°', icon: 'printer' } // } // ] // }, // å¹é ææè·¯å¾ { path: '*', redirect: '/404', hidden: true } // { // path: '*', // redirect: '/404', // hidden: true // } ] // å¨æè·¯ç±ï¼åºäºç¨æ·æé卿å»å è½½ billion-ui/src/views/index.vue
@@ -1,1097 +1,236 @@ <template> <div class="app-container home"> <el-row :gutter="20"> <el-col :sm="24" :lg="24"> <blockquote class="text-warning" style="font-size: 14px"> é¢åé¿éäºéç¨äºäº§å1888伿 å¸ <br /> <el-link href="https://www.aliyun.com/minisite/goods?userCode=brki8iof" type="primary" target="_blank" >https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link > <br /> é¢åè ¾è®¯äºéç¨äºäº§å2860伿 å¸ <br /> <el-link href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console" type="primary" target="_blank" >https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link > <br /> é¿éäºæå¡å¨ææ£åº <el-link href="http://aly.ruoyi.vip" type="primary" target="_blank" >>ââç¹æè¿å ¥ââ</el-link > è ¾è®¯äºæå¡å¨ç§æåº <el-link href="http://txy.ruoyi.vip" type="primary" target="_blank" >>ââç¹æè¿å ¥ââ</el-link ><br /> <h4 class="text-danger"> äºäº§åéç¨çº¢å ï¼å¯å å å®ç½å¸¸è§ä¼æ 使ç¨ã(ä» éæ°ç¨æ·) </h4> </blockquote> <div class="container"> <!-- æ é¢ --> <h1 class="title">çäº§æ°æ®çæ¿</h1> <hr /> </el-col> </el-row> <el-row :gutter="20"> <el-col :sm="24" :lg="12" style="padding-left: 20px"> <h2>è¥ä¾åå°ç®¡çæ¡æ¶</h2> <p> ä¸ç´æ³å䏿¬¾åå°ç®¡çç³»ç»ï¼çäºå¾å¤ä¼ç§ç弿ºé¡¹ç®ä½æ¯åç°æ²¡æåéèªå·±çãäºæ¯å©ç¨ç©ºé²ä¼æ¯æ¶é´å¼å§èªå·±åä¸å¥åå°ç³»ç»ã妿¤æäºè¥ä¾ç®¡çç³»ç»ï¼å¥¹å¯ä»¥ç¨äºææçWebåºç¨ç¨åºï¼å¦ç½ç«ç®¡çåå°ï¼ç½ç«ä¼åä¸å¿ï¼CMSï¼CRMï¼OAççï¼å½ç¶ï¼æ¨ä¹å¯ä»¥å¯¹å¥¹è¿è¡æ·±åº¦å®å¶ï¼ä»¥ååºæ´å¼ºç³»ç»ãææå端åå°ä»£ç å°è£ è¿åååç²¾ç®æä¸æï¼åºéæ¦çä½ãåæ¶æ¯æç§»å¨å®¢æ·ç«¯è®¿é®ãç³»ç»ä¼éç»æ´æ°ä¸äºå®ç¨åè½ã </p> <p> <b>å½åçæ¬:</b> <span>v{{ version }}</span> </p> <p> <el-tag type="danger">¥å è´¹å¼æº</el-tag> </p> <p> <el-button type="primary" size="mini" icon="el-icon-cloudy" plain @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')" >访é®ç äº</el-button > <el-button size="mini" icon="el-icon-s-home" plain @click="goTarget('http://ruoyi.vip')" >访é®ä¸»é¡µ</el-button > </p> </el-col> <!-- èªå¨æ¨ªåæ»å¨æç¤º --> <div class="scroll-tip"> <div ref="tipContent" class="tip-content">{{ scrollTipText }}</div> </div> <!-- è¡¨æ ¼åºå --> <div class="table-container"> <table> <thead> <tr> <th class="col-machine">æºå</th> <th class="col-plan">è®¡åæ°é</th> <th class="col-completed">ä¸çº¿æ°é</th> <th class="col-completed">ä¸çº¿æ°é</th> <th class="col-completed">å¨å¶æ°é</th> </tr> </thead> <tbody> <tr v-for="item in tableData" :key="item.id"> <td>{{ item.productCode }}</td> <td>{{ item.planQty }}</td> <td>{{ item.planQty }}</td> <td>{{ item.planQty }}</td> <td>{{ item.planQty }}</td> </tr> </tbody> </table> </div> <el-col :sm="24" :lg="12" style="padding-left: 50px"> <el-row> <el-col :span="12"> <h2>ææ¯éå</h2> </el-col> </el-row> <el-row> <el-col :span="6"> <h4>åç«¯ææ¯</h4> <ul> <li>SpringBoot</li> <li>Spring Security</li> <li>JWT</li> <li>MyBatis</li> <li>Druid</li> <li>Fastjson</li> <li>...</li> </ul> </el-col> <el-col :span="6"> <h4>åç«¯ææ¯</h4> <ul> <li>Vue</li> <li>Vuex</li> <li>Element-ui</li> <li>Axios</li> <li>Sass</li> <li>Quill</li> <li>...</li> </ul> </el-col> </el-row> </el-col> </el-row> <el-divider /> <el-row :gutter="20"> <el-col :xs="24" :sm="24" :md="12" :lg="8"> <el-card class="update-log"> <div slot="header" class="clearfix"> <span>è系信æ¯</span> </div> <div class="body"> <p> <i class="el-icon-s-promotion"></i> å®ç½ï¼<el-link href="http://www.ruoyi.vip" target="_blank" >http://www.ruoyi.vip</el-link > </p> <p> <i class="el-icon-user-solid"></i> QQ群ï¼<s> 满937441 </s> <s> 满887144332 </s> <s> 满180251782 </s> <s> 满104180207 </s> <s> 满186866453 </s> <s> 满201396349 </s> <s> 满101456076 </s> <s> 满101539465 </s> <s> 满264312783 </s> <s> 满167385320 </s> <s> 满104748341 </s> <s> 满160110482 </s> <s> 满170801498 </s> <s> 满108482800 </s> <s> 满101046199 </s> <s> 满136919097 </s> <s> 满143961921 </s> <s> 满174951577 </s> <s> 满161281055 </s> <s> 满138988063 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=SUc-msaypcqB2UTFif4eqGlBHkKcvMNP&authKey=JdQBouY2PG%2BS%2BCzAfIgbCGNgxyahpfh24IW%2F03rPxGilhqVbisLma%2FFFnt79DHNh&noverify=0&group_code=151450850" target="_blank">151450850</a> </p> <p> <i class="el-icon-chat-dot-round"></i> 微信ï¼<a href="javascript:;" >/ *è¥ä¾</a > </p> <p> <i class="el-icon-money"></i> æ¯ä»å®ï¼<a href="javascript:;" class="æ¯ä»å®ä¿¡æ¯" >/ *è¥ä¾</a > </p> </div> </el-card> </el-col> <el-col :xs="24" :sm="24" :md="12" :lg="8"> <el-card class="update-log"> <div slot="header" class="clearfix"> <span>æ´æ°æ¥å¿</span> </div> <el-collapse accordion> <el-collapse-item title="v3.8.8 - 2024-06-30"> <ol> <li>èåç®¡çæ°å¢è·¯ç±åç§°</li> <li>æ°å¢æ°æ®è±æè¿æ»¤æ³¨è§£</li> <li>ç¨æ·å¯ç æ°å¢éæ³å符éªè¯</li> <li>éå¶ç¨æ·æä½æ°æ®æéèå´</li> <li>代ç çææ°å¢åå»ºè¡¨ç»æåè½</li> <li>宿¶ä»»å¡ç½ååé ç½®èå´ç¼©å°</li> <li>ä¼å代ç çæä¸»åè¡¨å ³èæ¥è¯¢æ¹å¼</li> <li>Excel注解æ°å¢å±æ§comboReadDict</li> <li>Excel注解ColumnTypeç±»åæ°å¢ææ¬</li> <li>æ°å¢å½é åèµæºæä»¶é ç½®</li> <li>å级oshiå°ææ°çæ¬6.6.1</li> <li>å级druidå°ææ°çæ¬1.2.23</li> <li>å级core-jså°ææ°çæ¬3.37.1</li> <li>æ´æ°HttpUtilsä¸çUser-Agent</li> <li>æ´æ°compressionPluginå°6.1.2ä»¥å ¼å®¹node18+</li> <li>å级spring-securityå°å®å ¨çæ¬ï¼é²æ¢æ¼æ´é£é©</li> <li>å级spring-frameworkå°å®å ¨çæ¬ï¼é²æ¢æ¼æ´é£é©</li> <li>ä¼åèªå®ä¹XSS注解å¹é æ¹å¼</li> <li>ä¼åç¼åçæ§é®åå表æåºæ¾ç¤º</li> <li>ä¼å宿¶ä»»å¡æ¥å¿é»è®¤ææ¶é´æåº</li> <li>ä¼åé»è®¤æä»¶å¤§å°è¶ è¿2Gæ æçé®é¢</li> <li>ä¼åæ¥è¡¨ç¹æ®å符使ç¨åææ è¿è¡è½¬ä¹</li> <li>ä¼å宿¶ä»»å¡cron表达å¼å°æ¶é ç½®æ¾ç¤ºé误é®é¢</li> <li>ä¼åå¤ä¸ªèªå®æ°æ®æé使ç¨inæ¥è¯¢,é¿å 夿¬¡æ¼æ¥</li> <li>ä¼åå¯¼å ¥Excelæ¶è®¾ç½®dictType屿§é夿¥ç¼åé®é¢</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.7 - 2023-12-08"> <ol> <li>æä½æ¥å¿è®°å½é¨é¨åç§°</li> <li>å ¨å±æ°æ®åå¨ç¨æ·ç¼å·</li> <li>æ°å¢ç¼ç¨å¼å¤æèµæºè®¿é®æé</li> <li>æä½æ¥å¿å表æ°å¢IPå°åæ¥è¯¢</li> <li>宿¶ä»»å¡æ°å¢é¡µå»é¤ç¶æé项</li> <li>代ç çææ¯æéæ©å端模æ¿ç±»å</li> <li>æ¾éåç»ä»¶æ¯æå¤éæ¡å¼¹åºç±»å</li> <li>éç¨æåºå±æ§orderByåæ°éå¶é¿åº¦</li> <li>Excelèªå®ä¹æ°æ®å¤çå¨å¢å åå æ ¼/å·¥ä½ç°¿å¯¹è±¡</li> <li>å级oshiå°ææ°çæ¬6.4.8</li> <li>å级druidå°ææ°çæ¬1.2.20</li> <li>å级fastjsonå°ææ°ç2.0.43</li> <li>å级pagehelperå°ææ°ç1.4.7</li> <li>å级commons.ioå°ææ°çæ¬2.13.0</li> <li>å级element-uiå°ææ°çæ¬2.15.14</li> <li>ä¿®å¤äºçº§è·¯ç±ç¼åæ æé®é¢</li> <li>ä¿®å¤å¤é¾å¸¦ç«¯å£åºç°çå¼å¸¸</li> <li>ä¿®å¤æ 模æ¿ç¶çº§ç¼ç åéé误</li> <li>ä¿®å¤åå ¸è¡¨è¯¦æ é¡µé¢æç´¢é®é¢</li> <li>ä¿®å¤å é¾iframe没æä¼ éåæ°é®é¢</li> <li>ä¿®å¤èªå®ä¹åå ¸æ ·å¼ä¸çæçé®é¢</li> <li>ä¿®å¤åå ¸ç¼åå 餿¹æ³åæ°é误é®é¢</li> <li>ä¿®å¤Excelå¯¼å ¥æ°æ®ä¸´æ¶æä»¶æ æ³å é¤é®é¢</li> <li>ä¿®å¤æªç»å½å¸¦åæ°è®¿é®æåå忰䏢失é®é¢</li> <li>ä¿®å¤HeaderSearchç»ä»¶è·³è½¬query忰䏢失é®é¢</li> <li>ä¿®å¤ä»£ç çæå¯¼å ¥åå¿ å¡«é¡¹ä¸æ°æ®åºä¸å¹é é®é¢</li> <li>ä¿®å¤Excelså¯¼å ¥æ¶æ æ³è·åå°dictTypeåå ¸å¼é®é¢</li> <li>ä¼åä¸è½½zipæ¹æ³æ°å¢é®ç½©å±</li> <li>ä¼å头åä¸ä¼ åæ°æ°å¢æä»¶åç§°</li> <li>ä¼ååå ¸æ ç¾æ¯æèªå®ä¹åé符</li> <li>ä¼åèå管çç±»å为æé®ç¶æå¯é</li> <li>ä¼åå端é²éå¤æäº¤æ°æ®å¤§å°éå¶</li> <li>ä¼åTopNavèåæ²¡æå¾æ svg䏿¾ç¤º</li> <li>ä¼åæ°åéé¢å¤§å转æ¢ç²¾åº¦ä¸¢å¤±é®é¢</li> <li>ä¼å坿æ¬Editorç»ä»¶æ£éªå¾çæ ¼å¼</li> <li>ä¼å页ç¾å¨Firefoxæµè§å¨è¢«é®æ¡çé®é¢</li> <li>ä¼å个人ä¸å¿/åºæ¬èµæä¿®æ¹æ¶æ°æ®æ¾ç¤ºé®é¢</li> <li>ä¼åç¼åçæ§å¾è¡¨æ¯æè·éå±å¹å¤§å°èªéåºè°æ´</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.6 - 2023-06-30"> <ol> <li>æ¯æç»å½IPé»ååéå¶</li> <li>æ°å¢çæ§é¡µé¢å¾æ æ¾ç¤º</li> <li>æä½æ¥å¿æ°å¢æ¶èæ¶é´å±æ§</li> <li>å±è½å®æ¶ä»»å¡beanè¿è§çå符</li> <li>æ¥å¿ç®¡ç使ç¨ç´¢å¼æåæ¥è¯¢æ§è½</li> <li>æ¥å¿æ³¨è§£æ¯ææé¤æå®ç请æ±åæ°</li> <li>æ¯æèªå®ä¹éè屿§åè¿æ»¤å对象</li> <li>å级oshiå°ææ°çæ¬6.4.3</li> <li>å级druidå°ææ°çæ¬1.2.16</li> <li>å级fastjsonå°ææ°ç2.0.34</li> <li>å级spring-bootå°ææ°çæ¬2.5.15</li> <li>å级element-uiå°ææ°çæ¬2.15.13</li> <li>ç§»é¤apache/commons-fileuploadä¾èµ</li> <li>ä¿®å¤é¡µé¢åæ¢æ¶å¸å±éä¹±çé®é¢</li> <li>ä¿®å¤å¿å注解Anonymous空æéé®é¢</li> <li>ä¿®å¤è·¯ç±è·³è½¬è¢«é»æ¢æ¶å é¨äº§çæ¥éä¿¡æ¯é®é¢</li> <li>ä¿®å¤isMatchedIpçåæ°å¤æäº§ç空æéçé®é¢</li> <li>ä¿®å¤ç¨æ·å¤è§è²æ°æ®æéå¯è½åºç°æéæ¬åçæ åµ</li> <li>ä¿®å¤å¼å¯TopNavåä¸çº§èåè·¯ç±åæ°è®¾ç½®æ æé®é¢</li> <li>ä¿®å¤DictTagç»ä»¶value没æå¹é ç弿¶åå±ç¤ºvalue</li> <li>ä¼åæä»¶ä¸è½½åºç°çå¼å¸¸</li> <li>ä¼å鿩徿 ç»ä»¶é«äº®åæ¾</li> <li>ä¼åå¼¹çªåå¯¼èªæ åç§»çé®é¢</li> <li>ä¼åä¿®æ¹å¯ç æ¥å¿å卿æé®é¢</li> <li>ä¼åé¡µç¾æ å ³éå ¶ä»åºç°çå¼å¸¸é®é¢</li> <li>ä¼å页ç¾å ³é左侧é项æé¤é¦é¡µé项</li> <li>ä¼åå ³éå½åtab页跳转æå³ä¾§tab页</li> <li>ä¼åç¼ååè¡¨æ¸ é¤æä½æç¤ºä¸åçé®é¢</li> <li>ä¼åå符æªä½¿ç¨ä¸å线ä¸è¿è¡é©¼å³°å¼å¤ç</li> <li>ä¼åç¨æ·å¯¼å ¥æ´æ°æ¶éè·åç¨æ·ç¼å·é®é¢</li> <li>ä¼åä¾§è¾¹æ ç平尿 é¢ä¸VUE_APP_TITLEä¿æåæ¥</li> <li>ä¼å导åºExcelæ¶è®¾ç½®dictType屿§é夿¥ç¼åé®é¢</li> <li>è¿æ¥æ± Druidæ¯ææ°çé ç½®connectTimeoutåsocketTimeout</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.5 - 2023-01-01"> <ol> <li>宿¶ä»»å¡è¿è§çå符</li> <li>éç½®æ¶åæ¶é¨é¨éä¸</li> <li>æ°å¢è¿åè¦åæ¶æ¯æç¤º</li> <li>忽ç¥ä¸å¿ è¦ç屿§æ°æ®è¿å</li> <li>ä¿®æ¹åæ°é®åæ¶ç§»é¤åç¼åé ç½®</li> <li>å¯¼å ¥æ´æ°ç¨æ·æ°æ®åæ ¡éªæ°æ®æé</li> <li>å ¼å®¹Excel䏿æ¡å 容è¿å¤æ æ³æ¾ç¤ºçé®é¢</li> <li>å级echartså°ææ°çæ¬5.4.0</li> <li>å级core-jså°ææ°çæ¬3.25.3</li> <li>å级oshiå°ææ°çæ¬6.4.0</li> <li>å级kaptchaå°ææ°ç2.3.3</li> <li>å级druidå°ææ°çæ¬1.2.15</li> <li>å级fastjsonå°ææ°ç2.0.20</li> <li>å级pagehelperå°ææ°ç1.4.6</li> <li>ä¼åå¼¹çªå 容è¿å¤å±ç¤ºä¸å ¨é®é¢</li> <li>ä¼åswagger-uiéæèµæºä½¿ç¨ç¼å</li> <li>å¼å¯TopNav没æåèåéèä¾§è¾¹æ </li> <li>å é¤fuseæ æé项maxPatternLength</li> <li>ä¼å导åºå¯¹è±¡çåå表为空ä¼åºç°[]é®é¢</li> <li>ä¼åç¼è¾å¤´åæ¶éæé¨åä¼åæé»è²é®é¢</li> <li>ä¼åå°å±å¹ä¸ä¿®æ¹å¤´åçé¢å¸å±éä½çé®é¢</li> <li>ä¿®å¤ä»£ç çæå¾é屿§æ æé®é¢</li> <li>ä¿®å¤æä»¶ä¸ä¼ ç»ä»¶æ ¼å¼éªè¯é®é¢</li> <li>ä¿®å¤åæ¾æ°æ®åå ¸æ°ç»å¼å¸¸é®é¢</li> <li>ä¿®å¤sheetè¶ åºæå¤§è¡æ°å¼å¸¸é®é¢</li> <li>ä¿®å¤Log注解GET请æ±è®°å½ä¸å°åæ°é®é¢</li> <li>ä¿®å¤è°åº¦æ¥å¿ç¹å»å¤æ¬¡æ°æ®ä¸ååçé®é¢</li> <li>ä¿®å¤ä¸»é¢é¢è²å¨Drawerç»ä»¶ä¸ä¼å è½½é®é¢</li> <li>ä¿®å¤æä»¶åå å«ç¹æ®å符çæä»¶æ æ³ä¸è½½é®é¢</li> <li>ä¿®å¤table䏿´å¤æé®åæ¢ä¸»é¢è²æªçæä¿®å¤é®é¢</li> <li>ä¿®å¤æäºç¹æ§çç¯å¢çæä»£ç åä¹±ç TXTæä»¶é®é¢</li> <li>ä¿®å¤ä»£ç çæå¾ç/æä»¶/åéæ¶éæ©å¿ å¡«æ æ³æ ¡éªé®é¢</li> <li>ä¿®å¤æäºç¹æ§çæ åµç¨æ·ç¼è¾å¯¹è¯æ¡ä¸è§è²åé¨é¨æ æ³ä¿®æ¹é®é¢</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.4 - 2022-09-26"> <ol> <li>æ°æ®é»è¾å é¤ä¸è¿è¡å¯ä¸éªè¯</li> <li>Excelæ³¨è§£æ¯æå¯¼åºå¯¹è±¡çååè¡¨æ¹æ³</li> <li>Excelæ³¨è§£æ¯æèªå®ä¹éè屿§å</li> <li>Excelæ³¨è§£æ¯æbackgroundColor屿§è®¾ç½®èæ¯è²</li> <li>æ¯æé ç½®å¯ç æå¤§é误次æ°/é宿¶é´</li> <li>ç»å½æ¥å¿æ°å¢è§£éè´¦æ·åè½</li> <li>éç¨ä¸è½½æ¹æ³æ°å¢configé ç½®é项</li> <li>æ¯æå¤æéå符å¹é è§è²æ°æ®æé</li> <li>页é¢å åµiframe忢tabä¸å·æ°æ°æ®</li> <li>æä½æ¥å¿è®°å½æ¯ææé¤ææå±æ§å段</li> <li>ä¿®å¤å¤æä»¶ä¸ä¼ æ¥éåºç°çå¼å¸¸é®é¢</li> <li>ä¿®å¤å¾çé¢è§ç»ä»¶src屿§ä¸ºnull弿§å¶å°æ¥éé®é¢</li> <li>å级oshiå°ææ°çæ¬6.2.2</li> <li>å级fastjsonå°ææ°ç2.0.14</li> <li>å级pagehelperå°ææ°ç1.4.3</li> <li>å级core-jså°ææ°çæ¬3.25.2</li> <li>å级element-uiå°ææ°çæ¬2.15.10</li> <li>ä¼åä»»å¡è¿æä¸æ§è¡è°åº¦</li> <li>ä¼ååå ¸æ°æ®ä½¿ç¨storeåå</li> <li>ä¼åä¿®æ¹èµæå¤´å被è¦ççé®é¢</li> <li>ä¼åä¿®æ¹ç¨æ·ç»å½è´¦å·éå¤éªè¯</li> <li>ä¼å代ç çæåæ¥åå¼NULLé®é¢</li> <li>ä¼å宿¶ä»»å¡æ¯ææ§è¡ç¶ç±»æ¹æ³</li> <li>ä¼åç¨æ·ä¸ªäººä¿¡æ¯æ¥å£é²æ¢ä¿®æ¹é¨é¨</li> <li>ä¼åå¸å±è®¾ç½®ä½¿ç¨el-draweræ½å±æ¾ç¤º</li> <li>ä¼å没ææéçç¨æ·ç¼è¾é¨é¨ç¼ºå°æ°æ®</li> <li>ä¼åæ¥å¿æ³¨è§£è®°å½éå¶è¯·æ±å°åçé¿åº¦</li> <li>ä¼åexcel/scale屿§å¯¼åºåå æ ¼æ°å¼ç±»å</li> <li>ä¼åæ¥å¿æä½ä¸éç½®æé®æ¶é夿¥è¯¢çé®é¢</li> <li>ä¼åå¤ä¸ªç¸åè§è²æ°æ®å¯¼è´æéSQLéå¤é®é¢</li> <li>ä¼åè¡¨æ ¼ä¸å³ä¾§å·¥å ·æ¡ï¼æç´¢æé®æ¾é&å³ä¾§æ ·å¼å¸åºï¼</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.3 - 2022-06-27"> <ol> <li>æ°å¢ç¼åå表èååè½</li> <li>代ç çææ 表æ°å¢(å±å¼/æå )</li> <li>Excelæ³¨è§£æ¯æcoloråä½é¢è²</li> <li>æ°å¢Anonymouså¿å访é®ä¸é´ææ³¨è§£</li> <li>ç¨æ·å¤´åä¸ä¼ éå¶åªè½ä¸ºå¾çæ ¼å¼</li> <li>æ¥å£ä½¿ç¨æ³åä½¿å ¶çå°ååºå±æ§å段</li> <li>æ£æ¥å®æ¶ä»»å¡beanæå¨å 忝å¦ä¸ºç½ååé ç½®</li> <li>æ·»å 页ç¾openPageæ¯æä¼ éåæ°</li> <li>ç¨æ·ç¼åä¿¡æ¯æ·»å é¨é¨ancestorsç¥çº§å表</li> <li>å级element-uiå°ææ°çæ¬2.15.8</li> <li>å级oshiå°ææ°çæ¬6.1.6</li> <li>å级druidå°ææ°çæ¬1.2.11</li> <li>å级fastjsonå°ææ°ç2.0.8</li> <li>å级spring-bootå°ææ°çæ¬2.5.14</li> <li>é级jsencryptçæ¬å ¼å®¹IEæµè§å¨</li> <li>å é¤å¤ä½çsaltåæ®µ</li> <li>æ°å¢è·åä¸å¸¦åç¼æä»¶åç§°æ¹æ³</li> <li>æ°å¢è·åé ç½®æä»¶ä¸ç屿§å¼æ¹æ³</li> <li>æ°å¢å 容ç¼ç /è§£ç æ¹ä¾¿æä»¶éæä½¿ç¨</li> <li>åå ¸ç±»åå¿ é¡»ä»¥åæ¯å¼å¤´ï¼ä¸åªè½ä¸ºï¼å°ååæ¯ï¼æ°åï¼ä¸æ»çº¿ï¼</li> <li>ä¼å设置å页忰é»è®¤å¼</li> <li>ä¼å对空åç¬¦ä¸²åæ°å¤ççè¿æ»¤</li> <li>ä¼åæ¾ç¤ºé¡ºåºorderNumç±»å为æ´å</li> <li>ä¼å表åæå»ºæé®ä¸æ¾ç¤ºæ£åæ ¡éª</li> <li>ä¼ååå ¸æ°æ®åæ¾æ ·å¼ä¸ææ¡æ¾ç¤ºå¼</li> <li>ä¼åRååºæåç¶æç ä¸å ¨å±ä¿æä¸è´</li> <li>ä¼ådruidå¼å¯wallè¿æ»¤å¨åºç°çå¼å¸¸é®é¢</li> <li>ä¼åç¨æ·ç®¡ç左侧æ åç»ä»¶å¢å éä¸é«äº®ä¿æ</li> <li>ä¼åæ°å¢ç¨æ·ä¸è§è²ä¿¡æ¯&ç¨æ·ä¸å²ä½ä¿¡æ¯é»è¾</li> <li>ä¼åé»è®¤ä¸å¯ç¨å缩æä»¶ç¼å鲿¢node_modulesè¿å¤§</li> <li>ä¿®å¤åå ¸æ°æ®æ¾ç¤ºä¸å ¨é®é¢</li> <li>ä¿®å¤æä½æ¥å¿æ¥è¯¢ç±»åæ¡ä»¶ä¸º0æ¶ä¼æ¥å°æææ°æ®</li> <li>ä¿®å¤Excel注解prompt/comboåæ¶ä½¿ç¨ä¸çæé®é¢</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.2 - 2022-04-01"> <ol> <li>åç«¯æ¯æè®¾ç½®æ¯å¦éè¦é²æ¢æ°æ®éå¤æäº¤</li> <li>å¼å¯TopNav没æåèåæ åµéèä¾§è¾¹æ </li> <li>ä¾§è¾¹æ èååç§°è¿é¿æ¬åæ¾ç¤ºæ é¢</li> <li>ç¨æ·è®¿é®æ§å¶æ¶æ ¡éªæ°æ®æéï¼é²æ¢è¶æ</li> <li>导åºExcelæ¶å±è½å ¬å¼ï¼é²æ¢CSVæ³¨å ¥é£é©</li> <li>ç»ä»¶ImagePreviewæ¯æå¤å¾é¢è§æ¾ç¤º</li> <li>ç»ä»¶ImageUploadæ¯æå¤å¾åæ¶éæ©ä¸ä¼ </li> <li>ç»ä»¶FileUploadæ¯æå¤æä»¶åæ¶éæ©ä¸ä¼ </li> <li>æå¡çæ§æ°å¢è¿è¡åæ°ä¿¡æ¯æ¾ç¤º</li> <li>宿¶ä»»å¡ç®æ åç¬¦ä¸²è¿æ»¤ç¹æ®å符</li> <li>宿¶ä»»å¡ç®æ å符串éªè¯å åç½åå</li> <li>代ç çæå表å¾çæ¯æé¢è§</li> <li>代ç çæç¼è¾ä¿®æ¹æå¼æ°é¡µç¾</li> <li>代ç çææ°å¢Javaç±»åBoolean</li> <li>代ç çæåè¡¨æ¯ææ¥æ/åå ¸é ç½®</li> <li>代ç çæåæ¥ä¿çå¿ å¡«/ç±»åé项</li> <li>å级oshiå°ææ°çæ¬6.1.2</li> <li>å级fastjsonå°ææ°ç1.2.80</li> <li>å级pagehelperå°ææ°ç1.4.1</li> <li>å级spring-bootå°ææ°çæ¬2.5.11</li> <li>å级spring-boot-mybatiså°ææ°ç2.2.2</li> <li>æ·»å éæ¼çå页忰åçå屿§</li> <li>ä¿®æ¹npmå³å°è¿æçæ³¨åæºå°å</li> <li>ä¿®å¤å页ç»ä»¶è¯·æ±ä¸¤æ¬¡é®é¢</li> <li>ä¿®å¤éç¨æä»¶ä¸è½½æ¥å£è·¨åé®é¢</li> <li>ä¿®å¤Xssæ³¨è§£åæ®µå¼ä¸ºç©ºæ¶çå¼å¸¸é®é¢</li> <li>ä¿®å¤é项å¡ç¹å»å³é®å·æ°ä¸¢å¤±åæ°é®é¢</li> <li>ä¿®å¤è¡¨åæ¸ é¤å ç´ ä½ç½®æªåç´å± ä¸é®é¢</li> <li>ä¿®å¤æå¡çæ§ä¸è¿è¡åæ°æ¾ç¤ºæ¡ä»¶é误</li> <li>ä¿®å¤å¯¼å ¥Excelæ¶åå ¸åæ®µç±»å为Long转ä¹ä¸ºç©ºé®é¢</li> <li>ä¿®å¤ç»å½è¶ æ¶å·æ°é¡µé¢è·³è½¬ç»å½é¡µé¢è¿æç¤ºéæ°ç»å½é®é¢</li> <li>ä¼åå è½½åå ¸ç¼åæ°æ®</li> <li>ä¼åIPå°åè·åå°å¤ä¸ªçé®é¢</li> <li>ä¼åä»»å¡éåæ»¡æ¶ä»»å¡æç»çç¥</li> <li>ä¼åæä»¶ä¸ä¼ å ¼å®¹Weblogicç¯å¢</li> <li>ä¼å宿¶ä»»å¡é»è®¤ä¿åå°å å䏿§è¡</li> <li>ä¼åé¨é¨ä¿®æ¹ç¼©æ¾ååºç°çéä½é®é¢</li> <li>ä¼åExcelæ ¼å¼åä¸åç±»åçæ¥æå¯¹è±¡</li> <li>ä¼åèåè¡¨å ³é®å导è´çæä»¶æ¥éé®é¢</li> <li>ä¼åOracleç¨æ·å¤´åå为空æ¶ä¸æ¾ç¤ºé®é¢</li> <li>ä¼å页é¢è¥æªå¹é å°åå ¸æ ç¾åè¿åååå ¸å¼</li> <li>ä¼åä¿®å¤ç»å½å¤±æå夿¬¡è¯·æ±æç¤ºå¤æ¬¡å¼¹çªé®é¢</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.1 - 2022-01-01"> <ol> <li>æ°å¢Vue3å端代ç çææ¨¡æ¿</li> <li>æ°å¢å¾çé¢è§ç»ä»¶</li> <li>æ°å¢å缩æä»¶å®ç°æå Gzip</li> <li>èªå®ä¹xssæ ¡éªæ³¨è§£å®ç°</li> <li>èªå®ä¹æåå¤å¶åªè´´æä»¤</li> <li>代ç çæé¢è§æ¯æå¤å¶å 容</li> <li>è·¯ç±æ¯æåç¬é ç½®èåæè§è²æé</li> <li>ç¨æ·ç®¡çé¨é¨æ¥è¯¢éæ©èç¹åå页忰åå§</li> <li>ä¿®å¤ç¨æ·åé è§è²å±æ§é误</li> <li>ä¿®å¤æå ååä½å¾æ å¶ç°çä¹±ç é®é¢</li> <li>ä¿®å¤èå管çé置表ååºç°çé误</li> <li>ä¿®å¤çæ¬å·®å¼å¯¼è´çæå è½½æ¥éé®é¢</li> <li>ä¿®å¤Cronç»ä»¶ä¸å¨åæ¾é®é¢</li> <li>ä¿®å¤å®æ¶ä»»å¡å¤åæ°éå·åéçé®é¢</li> <li>ä¿®å¤æ ¹æ®IDæ¥è¯¢å表å¯è½åºç°ç䏻鮿º¢åºé®é¢</li> <li>ä¿®å¤tomcaté ç½®åæ°å·²è¿æé®é¢</li> <li>å级clipboardå°ææ°çæ¬2.0.8</li> <li>å级oshiå°ææ°çæ¬v5.8.6</li> <li>å级fastjsonå°ææ°ç1.2.79</li> <li>å级spring-bootå°ææ°çæ¬2.5.8</li> <li>å级log4j2å°2.17.1ï¼é²æ¢æ¼æ´é£é©</li> <li>ä¼åä¸è½½è§£æblobå¼å¸¸æç¤º</li> <li>ä¼å代ç çæåå ¸ç»éå¤é®é¢</li> <li>ä¼åæ¥è¯¢ç¨æ·çè§è²ç»&å²ä½ç»ä»£ç </li> <li>ä¼å宿¶ä»»å¡cron表达å¼å°æ¶è®¾ç½®24</li> <li>ä¼åç¨æ·å¯¼å ¥æç¤ºæº¢åºåæ¾ç¤ºæ»å¨æ¡</li> <li>ä¼åé²éå¤æäº¤æ è¯ç»å为(key+url+header)</li> <li>ä¼ååé¡µæ¹æ³è®¾ç½®æéç¨æ¹ä¾¿çµæ´»è°ç¨</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.8.0 - 2021-12-01"> <ol> <li>æ°å¢é å¥å¹¶åæ¥çVue3åç«¯çæ¬</li> <li>æ°å¢éç¨æ¹æ³ç®å模æ/ç¼å/ä¸è½½/æé/页ç¾ä½¿ç¨</li> <li>ä¼åå¯¼åºæ°æ®/使ç¨éç¨ä¸è½½æ¹æ³</li> <li>Excelæ³¨è§£æ¯æèªå®ä¹æ°æ®å¤çå¨</li> <li>Excelæ³¨è§£æ¯æå¯¼å ¥å¯¼åºæ é¢ä¿¡æ¯</li> <li>Excelå¯¼å ¥æ¯æ@Excels注解</li> <li>æ°å¢ç»ä»¶data-dictï¼ç®åæ°æ®åå ¸ä½¿ç¨</li> <li>æ°å¢Jaxbä¾èµï¼é²æ¢jdk8以ä¸åºç°çå ¼å®¹é误</li> <li>ç产ç¯å¢ä½¿ç¨è·¯ç±æå è½½æå页é¢ååºé度</li> <li>ä¿®å¤äºçº§ä»¥ä¸èååºç°ç404é®é¢</li> <li>é²éæäº¤æ³¨è§£æ¯æé ç½®é´éæ¶é´/æç¤ºæ¶æ¯</li> <li>æ¥å¿æ³¨è§£æ°å¢æ¯å¦ä¿åååºåæ°</li> <li>ä»»å¡å±è½è¿è§å符&åæ°å¿½ç¥åå¼å·ä¸çéå·</li> <li>å级SpringBootå°ææ°çæ¬2.5.6</li> <li>å级pagehelperå°ææ°ç1.4.0</li> <li>å级spring-boot-mybatiså°ææ°ç2.2.0</li> <li>å级oshiå°ææ°çæ¬v5.8.2</li> <li>å级druidå°ææ°ç1.2.8</li> <li>å级velocityå°ææ°çæ¬2.3</li> <li>å级fastjsonå°ææ°ç1.2.78</li> <li>å级axioså°ææ°çæ¬0.24.0</li> <li>å级dart-sasså°çæ¬1.32.13</li> <li>å级core-jså°ææ°çæ¬3.19.1</li> <li>å级jsencryptå°ææ°çæ¬3.2.1</li> <li>å级js-cookieå°ææ°çæ¬3.0.1</li> <li>å级file-saverå°ææ°çæ¬2.0.5</li> <li>å级sass-loaderå°ææ°çæ¬10.1.1</li> <li>å级element-uiå°ææ°çæ¬2.15.6</li> <li>æ°å¢sendGetæ åè¯·æ±æ¹æ³</li> <li>ç¦ç¨el-tagç»ä»¶çæ¸åå¨ç»</li> <li>代ç çæç¹å»é¢è§éç½®æ¿æ´»tab</li> <li>AjaxResultéåputæ¹æ³ï¼ä»¥æ¹ä¾¿é¾å¼è°ç¨</li> <li>ä¼åç»å½/éªè¯ç 请æ±headersä¸è®¾ç½®token</li> <li>ä¼åç¨æ·ä¸ªäººä¿¡æ¯æ¥å£é²æ¢ä¿®æ¹ç¨æ·å</li> <li>ä¼åCron表达å¼çæå¨å ³éæ¶éæ¯é¿å ç¼å</li> <li>ä¼å注åæåæç¤ºæ¶æ¯ç±»åsuccess</li> <li>ä¼åaopè¯æ³ï¼ä½¿ç¨springèªå¨æ³¨å ¥æ³¨è§£</li> <li>ä¼åè®°å½ç»å½ä¿¡æ¯ï¼ç§»é¤ä¸å¿ è¦çä¿®æ¹</li> <li>ä¼åmybatiså ¨å±é»è®¤çæ§è¡å¨</li> <li>ä¼åExcelå¯¼å ¥å¾çå¯è½åºç°çå¼å¸¸</li> <li>ä¿®å¤ä»£ç çææ¨¡æ¿ä¸»å表å é¤ç¼ºå°äºå¡</li> <li>ä¿®å¤æ¥å¿è®°å½å¯è½åºç°ç转æ¢å¼å¸¸</li> <li>ä¿®å¤ä»£ç çæå¤éæ¡åå ¸éæ¼é®é¢</li> <li>ä¿®å¤å ³éxssåè½å¯¼è´å¯éå¤è¯»RepeatableFilter失æ</li> <li>ä¿®å¤åç¬¦ä¸²æ æ³è¢«å转ä¹é®é¢</li> <li>ä¿®å¤å端主åè¡¨ä»£ç æ¨¡æ¿æ¹æ³åçæé误é®é¢</li> <li>ä¿®å¤xssè¿æ»¤åæ ¼å¼åºç°çå¼å¸¸</li> <li>ä¿®å¤swagger没ææå®dataTypeClass导è´å¯å¨åºç°warnæ¥å¿</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.7.0 - 2021-09-13"> <ol> <li>åæ°ç®¡çæ¯æé ç½®éªè¯ç å¼å ³</li> <li>æ°å¢æ¯å¦å¼å¯ç¨æ·æ³¨ååè½</li> <li>宿¶ä»»å¡æ¯æå¨çº¿çæcron表达å¼</li> <li>èåç®¡çæ¯æé 置路ç±åæ°</li> <li>æ¯æèªå®ä¹æ³¨è§£å®ç°æ¥å£éæµ</li> <li>Excelæ³¨è§£æ¯æImageå¾çå¯¼å ¥</li> <li>èªå®ä¹å¼¹å±æº¢åºæ»å¨æ ·å¼</li> <li>èªå®ä¹å¯æå¨å¼¹çªå®½åº¦æä»¤</li> <li>èªå®ä¹å¯æå¨å¼¹çªé«åº¦æä»¤</li> <li>ä¿®å¤ä»»æè´¦æ·è¶æé®é¢</li> <li>ä¿®æ¹æ¶æ£æ¥ç¨æ·æ°æ®æéèå´</li> <li>ä¿®å¤ä¿åé 置主é¢é¢è²å¤±æé®é¢</li> <li>æ°å¢æè²èå飿 ¼ä¸»é¢</li> <li>èå&é¨é¨æ°å¢å±å¼/æå åè½</li> <li>é¡µç¾æ°å¢å ³é左侧&æ·»å 徿 </li> <li>é¡¶é¨èåæé¤éèçé»è®¤è·¯ç±</li> <li>é¡¶é¨èååæ¥ç³»ç»ä¸»é¢æ ·å¼</li> <li>跳转路ç±é«äº®ç¸å¯¹åºçèåæ </li> <li>代ç çæä¸»å表å¤éè¡æ°æ®</li> <li>æ¥æèå´æ¯ææ·»å å¤ç»</li> <li>å级element-uiå°ææ°çæ¬2.15.5</li> <li>å级oshiå°ææ°çæ¬v5.8.0</li> <li>å级commons.ioå°ææ°çæ¬v2.11.0</li> <li>宿¶ä»»å¡å±è½ldapè¿ç¨è°ç¨</li> <li>宿¶ä»»å¡å±è½http(s)è¿ç¨è°ç¨</li> <li>è¡¥å 宿¶ä»»å¡è¡¨å段注é</li> <li>宿¶ä»»å¡å¯¹æ£æ¥å¼å¸¸è¿è¡äºå¡åæ»</li> <li>å¯ç¨ç¶é¨é¨ç¶ææé¤é¡¶çº§èç¹</li> <li>å¯ææ¬æ°å¢ä¸ä¼ æä»¶å¤§å°éå¶</li> <li>é»è®¤é¦é¡µä½¿ç¨keep-aliveç¼å</li> <li>ä¿®æ¹ä»£ç çæåå ¸åæ¾æ ·å¼</li> <li>èªå®ä¹å页åçåä¼ å ¥åæ°</li> <li>ä¿®å¤åå ¸ç»ä»¶å¼ä¸ºæ´å½¢ä¸æ¾ç¤ºé®é¢</li> <li>ä¿®å¤å®æ¶ä»»å¡æ¥å¿æ§è¡ç¶ææ¾ç¤º</li> <li>è§è²&èåæ°å¢åæ®µå±æ§æç¤ºä¿¡æ¯</li> <li>ä¿®å¤è§è²åé ç¨æ·é¡µé¢åæ°ç±»åé误æé</li> <li>ä¼åå¸å±è®¾ç½®å¨ç»ç¹æ</li> <li>ä¼åå¼å¸¸å¤çä¿¡æ¯</li> <li>ä¼åé误token导è´çè§£æå¼å¸¸</li> <li>å¯ç æ¡æ°å¢æ¾ç¤ºåæ¢å¯ç 徿 </li> <li>宿¶ä»»å¡æ°å¢æ´å¤æä½</li> <li>æ´å¤æä½æé®æ·»å æéæ§å¶</li> <li>å¯¼å ¥ç¨æ·æ ·å¼ä¼å</li> <li>æåéç¨æ¹æ³å°åºç±»æ§å¶å¨</li> <li>ä¼åä½¿ç¨æéå·¥å ·è·åç¨æ·ä¿¡æ¯</li> <li>ä¼åç¨æ·ä¸è½å é¤èªå·±</li> <li>ä¼åXSSè·¨ç«èæ¬è¿æ»¤</li> <li>ä¼å代ç çææ¨¡æ¿</li> <li>éªè¯ç é»è®¤20sè¶ æ¶</li> <li>BLOBä¸è½½æ¶æ¸ é¤URL对象å¼ç¨</li> <li>代ç çæå¯¼å ¥è¡¨æå建æ¶é´æåº</li> <li>ä¿®å¤ä»£ç çæé¡µé¢æ°æ®ç¼è¾ä¿åä¹åæ»æ¯è·³è½¬ç¬¬ä¸é¡µçé®é¢</li> <li>ä¿®å¤å¸¦safariæµè§å¨æ æ³æ ¼å¼åutcæ¥ææ ¼å¼yyyy-MM-dd'T'HH:mm:ss.SSSé®é¢</li> <li>å¤å¾ä¸ä¼ ç»ä»¶ç§»é¤å¤ä½çapiå°å&éªè¯å¤±è´¥å¯¼è´å¾çå é¤é®é¢&æ æ³å é¤ç¸åºå¾çä¿®å¤</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.6.0 - 2021-07-12"> <ol> <li>è§è²ç®¡çæ°å¢åé ç¨æ·åè½</li> <li>ç¨æ·ç®¡çæ°å¢åé è§è²åè½</li> <li>æ¥å¿åè¡¨æ¯ææåºæä½</li> <li>ä¼ååæ°&åå ¸ç¼åæä½</li> <li>ç³»ç»å¸å±é ç½®æ¯æå¨ææ é¢å¼å ³</li> <li>èåè·¯ç±é ç½®æ¯æå é¾è®¿é®</li> <li>é»è®¤è®¿é®å端é¦é¡µæ°å¢æç¤ºè¯</li> <li>坿æ¬é»è®¤ä¸ä¼ è¿åurlç±»å</li> <li>æ°å¢èªå®ä¹å¼¹çªææ½æä»¤</li> <li>å ¨å±æ³¨å常ç¨éç¨ç»ä»¶</li> <li>å ¨å±æè½½åå ¸æ ç¾ç»ä»¶</li> <li>ImageUploadç»ä»¶æ¯æå¤å¾çä¸ä¼ </li> <li>FileUploadç»ä»¶æ¯æå¤æä»¶ä¸ä¼ </li> <li>æä»¶ä¸ä¼ ç»ä»¶æ·»å æ°ééå¶å±æ§</li> <li>坿æ¬ç¼è¾ç»ä»¶æ·»å ç±»å屿§</li> <li>坿æ¬ç»ä»¶å·¥å ·æ é ç½®è§é¢</li> <li>å°è£ éç¨iframeç»ä»¶</li> <li>éå¶è¶ 级管çåä¸å 许æä½</li> <li>ç¨æ·ä¿¡æ¯é¿åº¦æ ¡éªéå¶</li> <li>å页ç»ä»¶æ°å¢pagerCount屿§</li> <li>æ·»å batèæ¬æ§è¡åºç¨</li> <li>å级oshiå°ææ°çæ¬v5.7.4</li> <li>å级element-uiå°ææ°çæ¬2.15.2</li> <li>å级pagehelperå°ææ°ç1.3.1</li> <li>å级commons.ioå°ææ°çæ¬v2.10.0</li> <li>å级commons.fileuploadå°ææ°çæ¬v1.4</li> <li>å级swaggerå°ææ°çæ¬v3.0.0</li> <li>ä¿®å¤å ³éconfirmæç¤ºæ¡æ§å¶å°æ¥éé®é¢</li> <li>ä¿®å¤åå¨çSQLæ³¨å ¥æ¼æ´é®é¢</li> <li>宿¶ä»»å¡å±è½rmiè¿ç¨è°ç¨</li> <li>ä¿®å¤ç¨æ·æç´¢å页åéé误</li> <li>ä¿®å¤å¯¼åºè§è²æ°æ®èå´ç¿»è¯ç¼ºå°ä» æ¬äºº</li> <li>ä¿®å¤è¡¨åæå»ºéæ©ä¸æéæ©æ§å¶å°æ¥éé®é¢</li> <li>ä¼åå¾çå·¥å ·ç±»è¯»åæä»¶</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.5.0 - 2021-05-25"> <ol> <li>æ°å¢èåå¯¼èªæ¾ç¤ºé£æ ¼TopNavï¼false为左侧导èªèåï¼true为顶é¨å¯¼èªèåï¼</li> <li>å¸å±è®¾ç½®æ¯æä¿å&éç½®é ç½®</li> <li>ä¿®å¤æ è¡¨æ°æ®æ¾ç¤ºä¸å ¨&å è½½æ ¢é®é¢</li> <li>æ°å¢IEæµè§å¨çæ¬è¿ä½æç¤ºé¡µé¢</li> <li>ç¨æ·ç»å½åè®°å½æåç»å½IP&æ¶é´</li> <li>页é¢å¯¼åºæé®ç¹å»ä¹åæ·»å é®ç½©</li> <li>坿æ¬ç¼è¾å¨æ¯æèªå®ä¹ä¸ä¼ å°å</li> <li>坿æ¬ç¼è¾ç»ä»¶æ°å¢readOnly屿§</li> <li>页ç¾TagsViewæ°å¢å ³éå³ä¾§åè½</li> <li>æ¾éåç»ä»¶å è½½åå§é»è®¤éèå</li> <li>å ³é头åä¸ä¼ çªå£è¿åé»è®¤å¾ç</li> <li>ä¸ªäººä¿¡æ¯æ·»å ææº&é®ç®±éå¤éªè¯</li> <li>代ç çææ¨¡æ¿å¯¼åºæé®ç¹å»åæ·»å é®ç½©</li> <li>代ç çææ¨¡æ¿æ 表æä½åæ·»å æ°å¢æé®</li> <li>代ç çææ¨¡æ¿ä¿®å¤ä¸»åè¡¨åæ®µéåé®é¢</li> <li>å级fastjsonå°ææ°ç1.2.76</li> <li>å级druidå°ææ°çæ¬v1.2.6</li> <li>å级mybatiså°ææ°ç3.5.6 黿¢è¿ç¨ä»£ç æ§è¡æ¼æ´</li> <li>å级oshiå°ææ°çæ¬v5.6.0</li> <li>velocityåé¤commons-collectionsçæ¬ï¼é²æ¢3.2.1çæ¬çååºååæ¼æ´</li> <li>æ°æ®çæ§é¡µé»è®¤è´¦æ·å¯ç 鲿¢è¶æè®¿é®</li> <li>ä¿®å¤firefoxä¸è¡¨åæå»ºææ½ä¼æ°æå¡ä¸ä¸ªé项å¡</li> <li>ä¿®æ£åç«¯å¯¼å ¥è¡¨æéæ è¯</li> <li>ä¿®æ£å端æä½æ¥å¿&ç»å½æ¥å¿æéæ è¯</li> <li>设置Redisé ç½®HashKeyåºåå</li> <li>å 餿使¥å¿è®°å½ä¿¡æ¯</li> <li>ä¸ä¼ åªä½ç±»åæ·»å è§é¢æ ¼å¼</li> <li>ä¿®å¤è¯·æ±å½¢åæªä¼ å¼è®°å½æ¥å¿å¼å¸¸é®é¢</li> <li>ä¼åxssæ ¡éªjsonè¯·æ±æ¡ä»¶</li> <li>æ çº§ç»ææ´æ°åèç¹ä½¿ç¨replaceFirst</li> <li>ä¼åExcelUtil空å¼å¤ç</li> <li>æ¥å¿è®°å½è¿æ»¤BindingResult对象ï¼é²æ¢å¼å¸¸</li> <li>ä¿®æ¹ä¸»é¢åminiç±»åæé®æ æé®é¢</li> <li>ä¼åéç¨ä¸è½½å®æåå é¤èç¹</li> <li>éç¨Controlleræ·»å ååºè¿åæ¶æ¯</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.4.0 - 2021-02-22"> <ol> <li>代ç çææ¨¡æ¿æ¯æä¸»å表</li> <li>è¡¨æ ¼å³ä¾§å·¥å ·æ ç»ä»¶æ¯ææ¾éå</li> <li>å¾çç»ä»¶æ·»å é¢è§&ç§»é¤åè½</li> <li>Excelæ³¨è§£æ¯æImageå¾ç导åº</li> <li>æä½æé®ç»è°æ´ä¸ºæ´ç´ æé®æ ·å¼</li> <li>代ç çææ¯ææä»¶ä¸ä¼ ç»ä»¶</li> <li>代ç çææ¥ææ§ä»¶åºåèå´</li> <li>代ç çææ°æ®åºææ¬ç±»åçæè¡¨åææ¬å</li> <li>ç¨æ·ææºé®ç®±&èåç»ä»¶ä¿®æ¹å 许空å符串</li> <li>å级SpringBootå°ææ°çæ¬2.2.13 æåå¯å¨é度</li> <li>å级druidå°ææ°çæ¬v1.2.4</li> <li>å级fastjsonå°ææ°ç1.2.75</li> <li>å级element-uiå°ææ°çæ¬2.15.0</li> <li>ä¿®å¤IE11æµè§å¨æ¥éé®é¢</li> <li>ä¼åå¤çº§èåä¹é´åæ¢æ æ³ç¼åçé®é¢</li> <li>ä¿®å¤å级èåæ æ³æ¾ç¤ºé®é¢</li> <li>ä¿®æ£ä¾§è¾¹æ éæè·¯ç±ä¸¢å¤±é®é¢</li> <li>ä¿®å¤è§è²ç®¡ç-ç¼è¾è§è²-åè½æéæ¾ç¤ºå¼å¸¸</li> <li>é ç½®æä»¶æ°å¢redisæ°æ®åºç´¢å¼å±æ§</li> <li>æéå·¥å ·ç±»å¢å admin夿</li> <li>è§è²éèªå®ä¹æéèå´æ¸ ç©ºéæ©å¼</li> <li>ä¿®å¤å¯¼å ¥æ°æ®ä¸ºè´æµ®ç¹æ°æ¶ä¸¢å¤±ç²¾åº¦é®é¢</li> <li>ç§»é¤path-to-regexpæ£åå¹é æä»¶</li> <li>ä¿®å¤çææ è¡¨ä»£ç å¼å¸¸</li> <li>ä¿®æ¹ipåæ®µé¿åº¦é²æ¢ipv6å°åé¿åº¦ä¸å¤</li> <li>鲿¢get请æ±åæ°å¼ä¸ºfalseæ0çç¹æ®å¼ä¼å¯¼è´æ æ³æ£ç¡®çä¼ å</li> <li>ç»å½åpushæ·»å catch鲿¢åºç°æ£æ¥é误</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.3.0 - 2020-12-14"> <ol> <li>æ°å¢ç¼åçæ§åè½</li> <li>æ¯æä¸»é¢é£æ ¼é ç½®</li> <li>ä¿®å¤å¤çº§èåä¹é´åæ¢æ æ³ç¼åçé®é¢</li> <li>å¤çº§èåèªå¨é ç½®ç»ä»¶</li> <li>代ç çæé¢è§æ¯æé«äº®æ¾ç¤º</li> <li>æ¯æGetè¯·æ±æ å°Paramsåæ°</li> <li>å é¤ç¨æ·åè§è²è§£ç»å ³è</li> <li>å»é¤ç¨æ·ææºé®ç®±é¨é¨å¿ å¡«éªè¯</li> <li>Excelæ¯ææ³¨è§£align坹齿¹å¼</li> <li>Excelæ¯æå¯¼å ¥Booleanåæ°æ®</li> <li>ä¼åå¤´åæ ·å¼ï¼é¼ æ ç§»å ¥æ¬åé®ç½©</li> <li>代ç çæé¢è§æä¾æ»å¨æºå¶</li> <li>代ç çæå é¤å¤ä½çæ°åfloatç±»å</li> <li>ä¿®æ£è½¬æ¢å符串çç®æ å符é屿§</li> <li>åæ¾æ°æ®åå ¸é²æ¢ç©ºå¼æ¥é</li> <li>æ¥å¿è®°å½å¢å è¿æ»¤å¤æä»¶åºæ¯</li> <li>ä¿®æ¹ç¼åSetæ¹æ³å¯è½å¯¼è´åµå¥çé®é¢</li> <li>ç§»é¤å端ä¸äºå¤ä½çä¾èµ</li> <li>鲿¢å®å ¨æ«æYUIåºç°çé£é©æç¤º</li> <li>ä¿®æ¹node-sass为dart-sass</li> <li>å级SpringBootå°ææ°çæ¬2.1.18</li> <li>å级poiå°ææ°çæ¬4.1.2</li> <li>å级oshiå°ææ°çæ¬v5.3.6</li> <li>å级bitwalkerå°ææ°çæ¬1.21</li> <li>å级axioså°ææ°çæ¬0.21.0</li> <li>å级element-uiå°ææ°çæ¬2.14.1</li> <li>å级vueå°ææ°çæ¬2.6.12</li> <li>å级vuexå°ææ°çæ¬3.6.0</li> <li>å级vue-cliå°çæ¬4.5.9</li> <li>å级vue-routerå°ææ°çæ¬3.4.9</li> <li>å级vue-cliå°ææ°çæ¬4.4.6</li> <li>å级vue-cropperå°ææ°çæ¬0.5.5</li> <li>å级clipboardå°ææ°çæ¬2.0.6</li> <li>å级core-jså°ææ°çæ¬3.8.1</li> <li>å级echartså°ææ°çæ¬4.9.0</li> <li>å级file-saverå°ææ°çæ¬2.0.4</li> <li>å级fuse.jså°ææ°çæ¬6.4.3</li> <li>å级js-beautifyå°ææ°çæ¬1.13.0</li> <li>å级js-cookieå°ææ°çæ¬2.2.1</li> <li>å级path-to-regexpå°ææ°çæ¬6.2.0</li> <li>å级quillå°ææ°çæ¬1.3.7</li> <li>å级screenfullå°ææ°çæ¬5.0.2</li> <li>å级sortablejså°ææ°çæ¬1.10.2</li> <li>å级vuedraggableå°ææ°çæ¬2.24.3</li> <li>å级chalkå°ææ°çæ¬4.1.0</li> <li>å级eslintå°ææ°çæ¬7.15.0</li> <li>å级eslint-plugin-vueå°ææ°çæ¬7.2.0</li> <li>å级lint-stagedå°ææ°çæ¬10.5.3</li> <li>å级runjså°ææ°çæ¬4.4.2</li> <li>å级sass-loaderå°ææ°çæ¬10.1.0</li> <li>å级script-ext-html-webpack-pluginå°ææ°çæ¬2.1.5</li> <li>å级svg-sprite-loaderå°ææ°çæ¬5.1.1</li> <li>å级vue-template-compilerå°ææ°çæ¬2.6.12</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.2.1 - 2020-11-18"> <ol> <li>黿¢ä»»ææä»¶ä¸è½½æ¼æ´</li> <li>代ç çææ¯æä¸ä¼ æ§ä»¶</li> <li>æ°å¢å¾çä¸ä¼ ç»ä»¶</li> <li>è°æ´é»è®¤é¦é¡µ</li> <li>å级druidå°ææ°çæ¬v1.2.2</li> <li>mapperLocationsé ç½®æ¯æåé符</li> <li>æéä¿¡æ¯è°æ´</li> <li>è°æ´sqlé»è®¤æ¶é´</li> <li>è§£å³ä»£ç çææ²¡æbitç±»åçé®é¢</li> <li>å级pagehelperå°ææ°ç1.3.0</li> </ol> </el-collapse-item> <el-collapse-item title="v3.2.0 - 2020-10-10"> <ol> <li>å级springbootçæ¬å°2.1.17 æåå®å ¨æ§</li> <li>å级oshiå°ææ°çæ¬v5.2.5</li> <li>å级druidå°ææ°çæ¬v1.2.1</li> <li>å级jjwtå°çæ¬0.9.1</li> <li>å级fastjsonå°ææ°ç1.2.74</li> <li>ä¿®æ¹sass为node-sassï¼é¿å el-icon徿 ä¹±ç </li> <li>代ç çææ¯æåæ¥æ°æ®åº</li> <li>代ç çææ¯æå¯ææ¬æ§ä»¶</li> <li>代ç çæé¡µé¢æ¶ä¸å¿½ç¥remark屿§</li> <li>代ç çææ·»å selectå¿ å¡«é项</li> <li>Excel导åºç±»åNUMERICæ¯æç²¾åº¦æµ®ç¹ç±»å</li> <li>Excel导åºtargetAtträ¼åè·åå¼ï¼é²æ¢getæ¹æ³ä¸è§è</li> <li>Excelæ³¨è§£æ¯æèªå¨ç»è®¡æ°æ®æ»å</li> <li>Excelæ³¨è§£æ¯æè®¾ç½®BigDecimal精度&èå ¥è§å</li> <li>èå&æ°æ®æéæ°å¢ï¼å±å¼/æå å ¨é/å ¨ä¸é ç¶åèå¨ï¼</li> <li>å è®¸ç¨æ·åé å°é¨é¨ç¶èç¹</li> <li>è忰墿¯å¦ç¼åkeep-alive</li> <li>è¡¨æ ¼æä½åé´è·è°æ´</li> <li>éå¶ç³»ç»å ç½®åæ°ä¸å 许å é¤</li> <li>坿æ¬ç»ä»¶ä¼åï¼æ¯æèªå®ä¹é«åº¦&å¾çå²çªé®é¢</li> <li>坿æ¬å·¥å ·æ æ ·å¼å¯¹é½</li> <li>å¯¼å ¥excelæ´å½¢å¼æ ¡éªä¼å</li> <li>ä¿®å¤é¡µç¾å ³éæææ¶åºå®æ ç¾è·¯ç±ä¸å·æ°é®é¢</li> <li>表åæå»ºå¸å±åç»ä»¶æ°å¢æé®</li> <li>左侧èåæåè¿é¿æ¾ç¤ºçç¥å·</li> <li>ä¿®æ£æ ¹èç¹ä¸ºåé¨é¨æ¶ï¼æ ç¶ç»ææ¾ç¤ºé®é¢</li> <li>ä¿®æ£è°ç¨ç®æ å符串æå¤§é¿åº¦</li> <li>ä¿®æ£èåæç¤ºä¿¡æ¯é误</li> <li>ä¿®æ£å®æ¶ä»»å¡æ§è¡ä¸æ¬¡æéæ è¯</li> <li>ä¿®æ£æ°æ®åºå符串类ånvarchar</li> <li>ä¼åéå½åèç¹</li> <li>ä¼åæ°æ®æé夿</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.1.0 - 2020-08-13"> <ol> <li>è¡¨æ ¼å·¥å ·æ å³ä¾§æ·»å å·æ°&æ¾éæ¥è¯¢ç»ä»¶</li> <li>åç«¯æ¯æCORSè·¨å请æ±</li> <li>代ç çææ¯æéæ©ä¸çº§èå</li> <li>代ç çææ¯æèªå®ä¹è·¯å¾</li> <li>代ç çææ¯æå¤éæ¡</li> <li>Excel导åºå¯¼å ¥æ¯ædictTypeåå ¸ç±»å</li> <li>Excelæ¯æåå²å符串ç»å 容</li> <li>éªè¯ç ç±»åæ¯æï¼æ°ç»è®¡ç®ãå符éªè¯ï¼</li> <li>å级vue-cliçæ¬å°4.4.4</li> <li>ä¿®æ¹ node-sass 为 dart-sass</li> <li>表åç±»å为Integer/Long设置æ´å½¢é»è®¤å¼</li> <li>代ç çæå¨é»è®¤mapperè·¯å¾ä¸é»è®¤mapperScanè·¯å¾ä¸ä¸è´</li> <li>ä¼åé²éå¤æäº¤æ¦æªå¨</li> <li>ä¼åä¸çº§èåä¸è½éæ©èªå·±</li> <li>ä¿®å¤è§è²çæéåé åï¼æªå®æ¶çæé®é¢</li> <li>ä¿®å¤å¨çº¿ç¨æ·æ¥å¿è®°å½ç±»å</li> <li>ä¿®å¤å¯ææ¬ç©ºæ ¼å缩è¿ä¿ååä¸çæé®é¢</li> <li>ä¿®å¤å¨çº¿ç¨æ·å¤æé»è¾</li> <li>å¯ä¸éå¶æ¡ä»¶åªè¿ååæ¡æ°æ®</li> <li>æ·»å è·åå½åçç¯å¢é ç½®æ¹æ³</li> <li>è¶ æ¶ç»å½å页é¢è·³è½¬å°é¦é¡µ</li> <li>å ¨å±å¼å¸¸ç¶ææ±åæ¦æªå¤ç</li> <li>HTMLè¿æ»¤å¨æ¹ä¸ºå°html转ä¹</li> <li>æ£æ¥åç¬¦æ¯æå°æ°ç¹&éçº§æ¹æå¼å¸¸æé</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v3.0.0 - 2020-07-20"> <ol> <li>ååºç¨è°æ´ä¸ºå¤æ¨¡å项ç®</li> <li>å级element-uiçæ¬å°2.13.2</li> <li>å é¤babelï¼æé«ç¼è¯é度ã</li> <li>æ°å¢èåé»è®¤ä¸»ç±»ç®</li> <li>ç¼ç æä»¶åä¿®æ¹ä¸ºuuidæ¹å¼</li> <li>宿¶ä»»å¡cron表达å¼éªè¯</li> <li>è§è²æéä¿®æ¹æ¶å·²ææéæªèªå¨å¾éå¼å¸¸ä¿®å¤</li> <li>鲿¢åæ¢æéç¨æ·åç»å½åºç°404</li> <li>Excelæ¯æsortå¯¼åºæåº</li> <li>åå»ºç¨æ·ä¸å è®¸éæ©è¶ çº§ç®¡çåè§è²</li> <li>ä¿®å¤ä»£ç çæå¯¼å ¥è¡¨ç»æåºç°å¼å¸¸é¡µé¢ä¸æéé®é¢</li> <li>ä¿®å¤ä»£ç çæç¹å»å¤æ¬¡è¡¨ä¿®æ¹æ°æ®ä¸ååçé®é¢</li> <li>ä¿®å¤å¤´åä¸ä¼ æåäºæ¬¡æå¼æ æ³æ¹åè£åªæ¡å¤§å°åä½ç½®é®é¢</li> <li>ä¿®å¤å¸å±ä¸ºsmallè miniç¨æ·è¡¨åæ¾ç¤ºéä½é®é¢</li> <li>ä¿®å¤çé¨ç½²å¯¼è´ç强æ¢å¼å¸¸é®é¢</li> <li>ä¿®æ¹ç¨æ·ç®¡çå¤éæ¡å®½åº¦ï¼é²æ¢é¨åæµè§å¨åºç°çç¥å·</li> <li>IpUtilså·¥å ·ï¼æ¸ é¤Xssç¹æ®å符ï¼é²æ¢Xffæ³¨å ¥æ»å»</li> <li>çædomain å¦ææ¯æµ®ç¹å ç»ä¸ç¨BigDecimal</li> <li>宿¶ä»»å¡è°æ´label-widthï¼é²æ¢é¨ç½²åºç°éä½</li> <li>è°æ´è¡¨å¤´åºå®åé»è®¤æ ·å¼</li> <li>代ç çææ¨¡æ¿è°æ´ï¼å段为Stringå¹¶ä¸å¿ å¡«åå 空串æ¡ä»¶</li> <li>代ç çæåå ¸Integer/Long使ç¨parseInt</li> <li> ä¿®å¤dict_sortä¸å¯update为0çé®é¢&æ¥è¯¢è¿åå¢å dict_sortååºæåº </li> <li>ä¿®æ£å²ä½å¯¼åºæé注解</li> <li>ç¦æ¢å å¯å¯æè¿åå端</li> <li>ä¿®å¤ä»£ç çæé¡µé¢ä¸çæ¥è¯¢æ¡ä»¶å建æ¶é´æªçæçé®é¢</li> <li>ä¿®å¤é¦é¡µæç´¢èåå¤é¾æ æ³ç¹å»è·³è½¬é®é¢</li> <li>ä¿®å¤èå管ç鿩徿 ï¼backspaceå 餿¶ä¸è¿æ»¤æ°æ®</li> <li>ç¨æ·ç®¡çé¨é¨åæ¯èç¹ä¸å¯æ£æ¥&æ¾ç¤ºè®¡æ°</li> <li>æ°æ®èå´è¿æ»¤å±æ§è°æ´</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v2.3.0 - 2020-06-01"> <ol> <li>å级fastjsonå°ææ°ç1.2.70 ä¿®å¤é«å±å®å ¨æ¼æ´</li> <li>devå¯å¨é»è®¤æå¼æµè§å¨</li> <li>vue-cli使ç¨é»è®¤source-map</li> <li>slidebar eslintæ¥éä¼å</li> <li>å½tags-viewæ»å¨å ³éå³é®èå</li> <li>åå ¸ç®¡çæ·»å ç¼å读å</li> <li>åæ°ç®¡çæ¯æç¼åæä½</li> <li>æ¯æä¸çº§èåï¼å主页å级ï¼å¨mainåºåæ¾ç¤º</li> <li>éå¶å¤é¾å°åå¿ é¡»ä»¥http(s)å¼å¤´</li> <li>tagview & sidebar 主é¢é¢è²ä¸element ui(å ¨å±)忥</li> <li>ä¿®æ¹æ°æ®æºç±»åä¼å 级ï¼å æ ¹æ®æ¹æ³ï¼åæ ¹æ®ç±»</li> <li>æ¯ææ¯å¦éè¦è®¾ç½®token屿§ï¼èªå®ä¹è¿åç æ¶æ¯ã</li> <li>swagger请æ±åç¼å å ¥é ç½®ã</li> <li>ç»å½å°ç¹è®¾ç½®å 容è¿é¿åéèæ¾ç¤º</li> <li>ä¿®å¤å®æ¶ä»»å¡æ§è¡ä¸æ¬¡æé®åä¸æç¤ºæ¶æ¯é®é¢</li> <li>ä¿®æ¹ä¸çº§é¨é¨ï¼éæ©é¡¹æé¤æ¬èº«åä¸çº§ï¼</li> <li>éç¨httpåéæ¹æ³å¢å åæ° contentType ç¼ç ç±»å</li> <li>æ´æ¢IPå°åæ¥è¯¢æ¥å£</li> <li>ä¿®å¤é¡µç¾åéundefined</li> <li>æ·»å æ ¡éªé¨é¨å 嫿ªåç¨çåé¨é¨</li> <li>ä¿®æ¹å®æ¶ä»»å¡è¯¦æ 䏿¬¡æ§è¡æ¶é´æ¥ææ¾ç¤ºé误</li> <li>è§è²ç®¡çæ¥è¯¢è®¾ç½®é»è®¤æåºå段</li> <li>swaggeræ·»å enableåæ°æ§å¶æ¯å¦å¯ç¨</li> <li>åªå¯¹jsonç±»åè¯·æ±æå»ºå¯éå¤è¯»åinputStreamçrequest</li> <li>ä¿®æ¹ä»£ç çæåå ¸åæ®µintç±»åæ²¡æèªå¨éä¸é®é¢</li> <li>vuexç¨æ·ååå¼ä¿®æ£</li> <li>è¡¨æ ¼æ æ¨¡æ¿å»æå¤ä½ç)</li> <li>代ç çæåºå·ä¿®æ£</li> <li>å ¨å±æ åµä¸ä¸è°æ´ä¸å¤è¾¹è·</li> <li>代ç çæDateåæ®µæ·»å é»è®¤æ ¼å¼</li> <li>ç¨æ·ç®¡çè§è²éæ©æéæ§å¶</li> <li>ä¿®å¤è·¯ç±æå è½½æ¥éé®é¢</li> <li>模æ¿sql.vmæ·»å èåç¶æ</li> <li>è®¾ç½®ç¨æ·åç§°ä¸è½ä¿®æ¹</li> <li>dialogæ·»å append-to-body屿§ï¼é²æ¢ieé®ç½©</li> <li>èååºåç¶æåæ¾ç¤ºéèåè½</li> <li>å级fastjsonå°ææ°ç1.2.68 ä¿®å¤å®å ¨å åº</li> <li>ä¿®å¤ä»£ç çæå¦æéæ©åå ¸ç±»å缺失éå·é®é¢</li> <li>ç»å½è¯·æ±paramsæ´æ¢ä¸ºdataï¼é²æ¢æ´é²url</li> <li>æ¥å¿è¿åæ¶é´æ ¼å¼å¤ç</li> <li>æ·»å handleæ§å¶å 许æå¨çå ç´ </li> <li>å¸å±è®¾ç½®ç¹å»æ©å¤§èå´</li> <li>代ç çæå屿§æåºæ¥è¯¢</li> <li>代ç çæåæ¯ææå¨æåº</li> <li>ä¿®å¤æ¶é´æ ¼å¼ä¸æ¯æiosé®é¢</li> <li>表åæå»ºæ·»å ç¶çº§classï¼é²æ¢å²çª</li> <li>宿¶ä»»å¡å¹¶å屿§ä¿®æ£</li> <li>è§è²ç¦ç¨&èåéè䏿¥è¯¢æé</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v2.2.0 - 2020-03-18"> <ol> <li>ç³»ç»çæ§æ°å¢å®æ¶ä»»å¡åè½</li> <li>æ·»å ä¸ä¸ªæå Webå·¥ç¨bat</li> <li>ä¿®å¤é¡µç¾é¼ æ æ»è½®æä¸çæ¶åï¼å¯ä»¥å ³éä¸å¯å ³éçtag</li> <li>ä¿®å¤ç¹å»éåºç»å½ææ¶ä¼æ æç¤ºé®é¢</li> <li>ä¿®å¤é²éå¤æäº¤æ³¨è§£æ æé®é¢</li> <li>ä¿®å¤éç¥å ¬åæ¹éå é¤å¼å¸¸é®é¢</li> <li>æ·»å èåæ¶è·¯ç±å°åå¿ å¡«éå¶</li> <li>代ç çæå段æè¿°å¯ç¼è¾</li> <li>ä¿®å¤ç¨æ·ä¿®æ¹ä¸ªäººä¿¡æ¯å¯¼è´ç¼åä¸è¿æé®é¢</li> <li>个人信æ¯å建æ¶é´è·åæ£ç¡®å±æ§å¼</li> <li>æä½æ¥å¿è¯¦ç»æ¾ç¤ºæ£ç¡®ç±»å</li> <li>å¯¼å ¥è¡¨åå»è¡æ°æ®æ¶éä¸å¯¹åºçå¤éæ¡</li> <li>æ¹éæ¿æ¢è¡¨åç¼é»è¾è°æ´</li> <li>åºå®éå®åè·¯å¾è¡¨è¾¾å¼</li> <li>å级element-uiçæ¬å°2.13.0</li> <li>æä½æ¥å¿æåºè°æ´</li> <li>ä¿®å¤chartsåæ¢ä¾§è¾¹æ æè 缩æ¾çªå£æ¾ç¤ºbug</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v2.1.0 - 2020-02-24"> <ol> <li>æ°å¢è¡¨åæå»º</li> <li>代ç çææ¯ææ è¡¨ç»æ</li> <li>æ°å¢ç¨æ·å¯¼å ¥</li> <li>ä¿®å¤å¨æå 载路ç±é¡µé¢å·æ°é®é¢</li> <li>ä¿®å¤å°åå¼å ³æ æé®é¢</li> <li>æ±åé误æç¤ºé¡µé¢</li> <li>代ç çæå·²ç¥é®é¢ä¿®æ¹</li> <li>ä¿®å¤å¤æ°æ®æºä¸é ç½®å ³éåºç°å¼å¸¸å¤ç</li> <li>æ·»å HTMLè¿æ»¤å¨ï¼ç¨äºå»é¤XSSæ¼æ´éæ£</li> <li>ä¿®å¤ä¸ä¼ 头忧å¶å°åºç°å¼å¸¸</li> <li>ä¿®æ¹ç¨æ·ç®¡çå页䏿£ç¡®çé®é¢</li> <li>ä¿®å¤éªè¯ç è®°å½æç¤ºé误</li> <li>ä¿®å¤request.js缺å°Messageå¼ç¨</li> <li>ä¿®å¤è¡¨æ ¼æ¶é´ä¸ºç©ºåºç°çå¼å¸¸</li> <li>æ·»å Jacksonæ¥æååºååæ¶åºé ç½®</li> <li>è°æ´æ ¹æ®ç¨æ·æéå è½½èåæ°æ®æ å½¢ç»æ</li> <li>è°æ´æåç»å½ä¸æ¢å¤æé®ï¼é²æ¢å¤æ¬¡ç¹å»</li> <li>ä¿®æ¹ç¨æ·ä¸ªäººèµæåæ¥ç¼åä¿¡æ¯</li> <li>ä¿®å¤é¡µé¢åæ¶åºç°el-uploadåEditor䏿¾ç¤ºå¤ç</li> <li>ä¿®å¤å¨è§è²ç®¡ç页修æ¹èåæéå¶å°æªéä¸é®é¢</li> <li>é ç½®æä»¶æ°å¢rediså¯ç 屿§</li> <li>设置mybatiså ¨å±çé ç½®æä»¶</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v2.0.0 - 2019-12-02"> <ol> <li>æ°å¢ä»£ç çæ</li> <li>æ°å¢@RepeatSubmit注解ï¼é²æ¢éå¤æäº¤</li> <li>æ°å¢èå主ç®å½æ·»å /å 餿ä½</li> <li>æ¥å¿è®°å½è¿æ»¤ç¹æ®å¯¹è±¡ï¼é²æ¢è½¬æ¢å¼å¸¸</li> <li>ä¿®æ¹ä»£ç çæè·¯ç±èæ¬é误</li> <li>ç¨æ·ä¸ä¼ 头å宿¶åæ¥ç¼åï¼æ ééæ°ç»å½</li> <li>è°æ´åæ¢é¡µç¾åä¸éæ°å è½½æ°æ®</li> <li>æ·»å jsencryptå®ç°åæ°çå端å å¯</li> <li>ç³»ç»éåºå é¤ç¨æ·ç¼åè®°å½</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v1.1.0 - 2019-11-11"> <ol> <li>æ°å¢å¨çº¿ç¨æ·ç®¡ç</li> <li>æ°å¢æé®ç»åè½å®ç°ï¼æ¹éå é¤ã导åºãæ¸ ç©ºï¼</li> <li>æ°å¢æ¥è¯¢æ¡ä»¶éç½®æé®</li> <li>æ°å¢Swaggerå ¨å±Tokené ç½®</li> <li>æ°å¢åç«¯åæ°æ ¡éª</li> <li>ä¿®å¤åå ¸ç®¡ç页é¢çæ¥ææ¥è¯¢å¼å¸¸</li> <li>ä¿®æ¹æ¶é´å½æ°å½å鲿¢å²çª</li> <li>å»é¤èåä¸çº§æ ¡éªï¼é»è®¤ä¸ºé¡¶çº§</li> <li>ä¿®å¤ç¨æ·å¯ç æ æ³ä¿®æ¹é®é¢</li> <li>ä¿®å¤èåç±»å为æé®æ¶ä¸æ¾ç¤ºæéæ è¯</li> <li>å ¶ä»ç»èä¼å</li> </ol> </el-collapse-item> <el-collapse-item title="v1.0.0 - 2019-10-08"> <ol> <li>è¥ä¾åå端åç¦»ç³»ç»æ£å¼åå¸</li> </ol> </el-collapse-item> </el-collapse> </el-card> </el-col> <el-col :xs="24" :sm="24" :md="12" :lg="8"> <el-card class="update-log"> <div slot="header" class="clearfix"> <span>æèµ æ¯æ</span> </div> <div class="body"> <img src="@/assets/images/pay.png" alt="donate" width="100%" /> <span style="display: inline-block; height: 30px; line-height: 30px" >ä½ å¯ä»¥è¯·ä½è 忝åå¡è¡¨ç¤ºé¼å±</span > </div> </el-card> </el-col> </el-row> <!-- ä¿¡æ¯æè¿°æ¡ --> <div class="info-box"> <p>åè¦ä¿¡æ¯ï¼</p> <ul> <li>1. æ°æ®ç»è®¡å¨æä¸ºå½æ¥00:00è³å½åæ¶é´</li> <li>2. 宿æ°éå å«å¨å¶å</li> <li>3. æ¯å°æ¶æ´æ°ä¸æ¬¡æ°æ®</li> </ul> </div> </div> </template> <script> import { getWelcomeWord } from '@/api/main/da/stationCollection' import { getTodayList } from '@/api/main/om/info' export default { name: "Index", data() { return { // çæ¬å· version: "3.8.8" }; scrollTipText: '欢è¿ç»å½çäº§çæ¿ 欢è¿ç»å½çäº§çæ¿ 欢è¿ç»å½çäº§çæ¿ 欢è¿ç»å½çäº§çæ¿ 欢è¿ç»å½çäº§çæ¿ 欢è¿ç»å½çäº§çæ¿ ', tableData: [], } }, mounted() { this.getWelcomeWord() this.checkScrollNeeded() window.addEventListener('resize', this.checkScrollNeeded) this.getTableList() }, beforeDestroy() { window.removeEventListener('resize', this.checkScrollNeeded) }, methods: { goTarget(href) { window.open(href, "_blank"); } } }; </script> //çæ¿æ¬¢è¿è¯ getWelcomeWord(){ const query = 'welcome'; getWelcomeWord(query).then(res => { console.log('res',res) if (res.code === 200){ if (res.data.length > 0){ if (res.data[0].remark !== null && res.data[0].remark !== ''){ console.log('111') this.scrollTipText = res.data[0].remark console.log('this.scrollTipText',this.scrollTipText) } } } }) }, getTableList(){ getTodayList().then(res => { if (res.code === 200){ this.tableData = res.data } }) }, checkScrollNeeded() { this.$nextTick(() => { const content = this.$refs.tipContent const container = content.parentElement <style scoped lang="scss"> .home { blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .col-item { margin-bottom: 20px; } // æ£æµå 容æ¯å¦è¶ åºå®¹å¨ const isOverflow = content.scrollWidth > container.offsetWidth ul { padding: 0; margin: 0; } // 卿忢æ»å¨ç¶æ content.classList.toggle('auto-scroll', isOverflow) font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; color: #676a6c; overflow-x: hidden; ul { list-style-type: none; } h4 { margin-top: 0px; } h2 { margin-top: 10px; font-size: 26px; font-weight: 100; } p { margin-top: 10px; b { font-weight: 700; } } .update-log { ol { display: block; list-style-type: decimal; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0; margin-inline-end: 0; padding-inline-start: 40px; // 设置æ»å¨é度ï¼å¯æ ¹æ®éè¦è°æ´ç³»æ°ï¼ if (isOverflow) { const overflowRatio = content.scrollWidth / container.offsetWidth content.style.setProperty('--scroll-duration', `${overflowRatio * 20}s`) } }) } } } </style> </script> <style scoped> .container { max-width: 2200px; margin: 0 auto; padding: 20px; } /* æ 颿 ·å¼ */ .title { font-size: 40px; font-weight: bold; text-align: center; margin-bottom: 30px; color: #333; } .scroll-tip { background: #e2fad0; border: 1px solid #80e33d; border-radius: 4px; padding: 12px; margin-bottom: 20px; overflow: hidden; /* éèæº¢åºé¨å */ position: relative; } .tip-content { white-space: nowrap; display: inline-block; position: relative; left: 0; transition: all 0.3s; padding-right: 20px; /* 鲿¢æåç´§è´´è¾¹ç¼ */ font-size: 30px; color: red; } /* èªå¨æ»å¨å¨ç» */ .tip-content.auto-scroll { animation: auto-scroll linear infinite; animation-duration: var(--scroll-duration, 15s); } @keyframes auto-scroll { 0% { transform: translateX(100%); } 100% { transform: translateX(calc(-100% - 20px)); /* æ»å¨å°å®å ¨æ¶å¤± */ } } /* è¡¨æ ¼æ ·å¼ */ .table-container { border: 1px solid #e8e8e8; border-radius: 4px; overflow: hidden; margin-bottom: 20px; } table { width: 100%; border-collapse: collapse; } thead { background: #fafafa; } th { padding: 16px; text-align: left; font-weight: 500; color: rgba(0, 0, 0, 0.85); border-bottom: 1px solid #e8e8e8; } tbody { display: block; max-height: 150px; /* 3è¡é«åº¦ */ overflow-y: auto; } tr { display: table; width: 100%; table-layout: fixed; } td { padding: 12px 16px; border-bottom: 1px solid #e8e8e8; color: rgba(0, 0, 0, 0.65); } /* å宽设置 */ .col-machine { width: 25%; } .col-plan { width: 25%; } .col-completed { width: 25%; } /* ä¿¡æ¯æè¿°æ¡ */ .info-box { background: #f0f9ff; border: 1px solid #91d5ff; border-radius: 4px; padding: 16px; color: #096dd9; } .info-box p { font-weight: 500; margin-bottom: 8px; } .info-box ul { margin: 0; padding-left: 20px; } .info-box li { line-height: 1.6; font-size: 14px; } </style> billion-ui/src/views/main/bq/prototypeLabelPrinting/index.vue
@@ -1,309 +1,101 @@ <template> <div class="app-container"> <el-row :gutter="20"> <el-col :span="12"> <el-col :span="24"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>æ ·æºæ ç¾æå°</span> <span>æ«ç ä¸çº¿</span> </div> <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form-item label="ç»å«" prop="groupName"> <el-select v-model="form.groupName" placeholder="è¯·éæ©ç»å«" style="width: 100%"> <el-option v-for="item in groupOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> <el-form ref="form" :model="form" :rules="rules" label-width="100px" @submit.native.prevent> <el-form-item label="åºåå·" prop="SNCode"> <input v-model="form.SNCode" ref="inputdata" placeholder="请è¾å ¥åºåå·" style="width: 100%; height: 40px; font-size: 30px" /> </el-form-item> <el-form-item label="æ ·æºç¼å·" prop="prototypeCode"> <el-input v-model="form.prototypeCode" placeholder="请è¾å ¥æ ·æºç¼å·" style="width: 100%"> </el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handlePrint" :loading="printing"> <i class="el-icon-printer"></i> æå°æ ç¾ </el-button> </el-form-item> </el-form> </el-card> </el-col> <el-col :span="12"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>é¢è§åºå</span> </div> <div class="print-area"> <div id="printSection" class="qrcode-container"> <qrcode-vue :value="qrCodeValue" :size="300" level="H"></qrcode-vue> <div class="info-text"> <div class="text-item">ç»å«ï¼{{ form.groupName || '-' }}</div> <div class="text-item">æ ·æºç¼å·ï¼{{ form.prototypeCode || '-' }}</div> </div> </div> </div> </el-card> </el-col> </el-row> </div> </template> <script> import QrcodeVue from 'qrcode.vue' import QRCode from 'qrcode' import {addPassStationCollection} from "@/api/main/da/stationCollection"; export default { name: 'PrototypeLabelPrinting', components: { QrcodeVue }, data() { return { printing: false, scannerFlag: false, form: { groupName: '', prototypeCode: '' SNCode: '', LocationCode: 'OP010' }, rules: { groupName: [ { required: true, message: 'è¯·éæ©ç»å«', trigger: 'change' } ], prototypeCode: [ { required: true, message: '请è¾å ¥æ ·æºç¼å·', trigger: 'blur' } SNCode: [ { required: true, message: '请è¾å ¥åºåå·', trigger: 'blur' } ] }, groupOptions: [ { value: 'ç åä¸ç»', label: 'ç åä¸ç»' }, { value: 'ç åäºç»', label: 'ç åäºç»' }, { value: 'ç åä¸ç»', label: 'ç åä¸ç»ç åä¸ç»' } ] } }, computed: { qrCodeValue() { if (!this.form.groupName || !this.form.prototypeCode) { return 'ææ æ°æ®' } return `${this.form.groupName}${this.form.prototypeCode}` } }, methods: { handlePrint() { this.$message.success('æå°') this.$refs.form.validate(async valid => { if (valid) { this.printing = true try { const qrDataUrl = await QRCode.toDataURL(this.qrCodeValue, { width: 800, margin: 1, errorCorrectionLevel: 'H' }) const testPrintContent = ` <!DOCTYPE html> <html> <head> <title>æµè¯æå°</title> </head> <body> <h1>è¿æ¯ä¸ä¸ªæµè¯æå°å 容</h1> </body> </html> ` // 第ä¸ä¸ªæå°æºçå 容 - åå§æ ç¾ const firstPrintContent = ` <!DOCTYPE html> <html> <head> <title>æ ·æºæ ç¾æå°-1</title> <style> @page { size: 100mm 100mm; margin: 0; } @media print { html, body { margin: 0; padding: 0; height: 100mm; page-break-after: avoid; page-break-before: avoid; } } .print-container { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100mm; height: 80mm; box-sizing: border-box; padding: 5mm; page-break-inside: avoid; } .qr-code { width: 80mm; height: 80mm; margin-bottom: 3mm; } .qr-code img { width: 100%; height: 100%; object-fit: contain; } .info-text { text-align: center; font-size: 3mm; font-weight: bold; line-height: 1.5; } .info-text div { margin: 1mm 0; } </style> </head> <body> <div class="print-container"> <div class="qr-code"> <img src="${qrDataUrl}" alt="QR Code"/> </div> <div class="info-text"> <div>ç»å«ï¼${this.form.groupName}</div> <div>æ ·æºç¼å·ï¼${this.form.prototypeCode}</div> <div>åå§æ ç¾</div> </div> </div> </body> </html> ` // 第äºä¸ªæå°æºçå 容 - å¤ç¨æ ç¾ const secondPrintContent = ` <!DOCTYPE html> <html> <head> <title>æ ·æºæ ç¾æå°-2</title> <style> @page { size: 100mm 100mm; margin: 0; } @media print { html, body { margin: 0; padding: 0; height: 100mm; page-break-after: avoid; page-break-before: avoid; } } .print-container { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100mm; height: 80mm; box-sizing: border-box; padding: 5mm; page-break-inside: avoid; } .qr-code { width: 80mm; height: 80mm; margin-bottom: 3mm; } .qr-code img { width: 100%; height: 100%; object-fit: contain; } .info-text { text-align: center; font-size: 3mm; font-weight: bold; line-height: 1.5; } .info-text div { margin: 1mm 0; color: red; } </style> </head> <body> <div class="print-container"> <div class="qr-code"> <img src="${qrDataUrl}" alt="QR Code"/> </div> <div class="info-text"> <div>ç»å«ï¼${this.form.groupName}</div> <div>æ ·æºç¼å·ï¼${this.form.prototypeCode}</div> <div>å¤ç¨æ ç¾</div> </div> </div> </body> </html> ` // æå®æå°æºåç§°å对åºçå 容 const printTasks = [ { printerName: 'Kyocera ECOSYS M4125idn KX', // 使ç¨ç³»ç»ä¸å®é åå¨çæå°æºåç§° content: testPrintContent }, { printerName: 'Kyocera ECOSYS M4125idn KX', // 使ç¨ç³»ç»ä¸å®é åå¨çæå°æºåç§° content: firstPrintContent }, { printerName: 'Kyocera ECOSYS M4125idn KX', // 使ç¨ç³»ç»ä¸å®é åå¨çæå°æºåç§° content: secondPrintContent } ] // ç嬿å°å®æäºä»¶ if (window.electron?.isElectron) { this.$message.success('22') window.electron.ipcRenderer.on('print-complete', (result) => { if (result.success) { this.$message.success('æå°æå') } else { this.$message.error(`æå°å¤±è´¥: ${result.error}`) console.error('Print error:', result.error) } }) // åéæå°ä»»å¡å°ä¸»è¿ç¨ printTasks.forEach(task => { this.$message.success('33') window.electron.ipcRenderer.send('silent-print', { content: task.content, printerName: task.printerName }) }) } this.printing = false } catch (error) { console.error('æå°å¤±è´¥:', error) this.$message.error('æå°å¤±è´¥ï¼è¯·éè¯') this.printing = false } } setFocus(){ this.$nextTick(()=>{ this.$refs.inputdata.focus() }) } }, handleScannerInput(event){ if (this.scannerFlag){ this.form.SNCode = '' this.$refs.inputdata.value = '' this.scannerFlag = false } const input = event.target this.form.SNCode = input.value if (event.key === 'Enter'){ this.scannerFlag = true //æ«æå®æ addPassStationCollection({SNCode:this.form.SNCode,LocationCode: this.form.LocationCode}).then(res => { if (res.code === 200){ this.$message({ message: "æ«ç 宿", type: "success" }) } else { this.$message({ message: "æ«ç é误ï¼è¯·éè¯", type: "error" }) } }) } }, }, mounted() { console.log('00') this.setFocus(); this.$nextTick(() => { if (this.$refs.inputdata){ this.$refs.inputdata.addEventListener('keydown',this.handleScannerInput) } }) }, beforeDestroy() { this.$refs.inputdata.removeEventListener('keydown',this.handleScannerInput) } } </script> billion-ui/src/views/main/bq/workstationOperation/index.vue
@@ -1,202 +1,99 @@ <template> <div class="app-container"> <el-row :gutter="5"> <el-col :span="6"> <el-card class="box-card"> <div class="card-item"> <span class="label">å·¥ä½ç¼å·:</span> <el-select v-model="locationCode" placeholder="è¯·éæ©" class="content-item" @change="handleLocationChange"> <el-option v-for="item in locationCodeOptions" :key="item.locationCode" :label="item.locationCode" :value="item.locationCode"> </el-option> </el-select> </div> </el-card> </el-col> <el-col :span="6"> <el-card class="box-card"> <div class="card-item"> <span class="label">æ ·æºç¼å·:</span> <span class="content-item">{{prototypeNumber}}</span> </div> </el-card> </el-col> <el-col :span="12"> <el-card class="box-card"> <div class="card-item"> <span class="label">ç©æç¼å·:</span> <el-input class="content-item" v-model="materialCode" placeholder="请è¾å ¥ç©æç¼å·" @keyup.enter.native="handleMaterialCodeEnter"></el-input> <el-button @click="test1" type="primary">ä¸»è¦æé®</el-button> <el-button type="success">æåæé®</el-button> </div> </el-card> </el-col> </el-row> <el-row> <el-row :gutter="20"> <el-col :span="24"> <el-card class="box-card"> <el-table ref="formulaTable" :data="sortedFormulaData" height="350" style="width: 100%" :row-class-name="tableRowClassName" > <el-table-column show-overflow-tooltip label="å·¥ä½ç¼å·" align="center" prop="locationCode" /> <el-table-column show-overflow-tooltip label="产åç¼å·" align="center" prop="productCode" /> <el-table-column show-overflow-tooltip label="æä½å 容" align="center" prop="operationContent" /> <el-table-column show-overflow-tooltip label="ç©æç¼ç " align="center" prop="materialCode" /> <el-table-column show-overflow-tooltip label="ééå¼" align="center" prop="collectData" /> <el-table-column show-overflow-tooltip label="ç»æ" align="center" prop="results" /> </el-table> <div slot="header" class="clearfix"> <span>æ«ç ä¸çº¿</span> </div> <el-form ref="form" :model="form" :rules="rules" label-width="100px" @submit.native.prevent> <el-form-item label="åºåå·" prop="SNCode"> <input v-model="form.SNCode" ref="inputdata" placeholder="请è¾å ¥åºåå·" style="width: 100%; height: 40px; font-size: 30px" /> </el-form-item> </el-form> </el-card> </el-col> </el-row> <el-row> <el-col :span="24"> <el-card class="box-card"> <span>缺é·è®°å½:</span> <el-input style="width: 70%" v-model="defectInformation" placeholder="请è¾å ¥ç¼ºé·è®°å½"></el-input> </el-card> </el-col> </el-row> </div> </template> <script> import { listLocationInfo, getLocationInfo, delLocationInfo, addLocationInfo, updateLocationInfo } from "@/api/main/bs/locationInfo"; import {addInfo, delInfo, getInfo, listInfo, updateCollectData, updateInfo} from "@/api/main/bs/formulaChildinfo"; import {addPassStationCollection} from "@/api/main/da/stationCollection"; export default { name: "workstationOperation", data() { return { printInfoData: { softwareVersion: 'SW001.001', //è½¯ä»¶çæ¬å· hardwareVersion: 'HW001.001', //ç¡¬ä»¶çæ¬å· printModel: 'H2155D', //åå· partNumber: '0', //é¶é¨ä»¶å· supplierCode: '993983', //ä¾åºåç¼ç scannerFlag: false, form: { SNCode: '', LocationCode: 'OP450' }, locationCode: '', prototypeNumber: '', materialCode: '', defectInformation: '', locationCodeOptions: [], formulaTableData: [], isFirstEnter: true } }, created() { this.initLocationOptions() }, computed: { sortedFormulaData() { // å¯¹æ°æ®è¿è¡æåºï¼OKçæ¾å¨åé¢ return [...this.formulaTableData].sort((a, b) => { if (a.results === 'OK' && b.results !== 'OK') return -1; if (a.results !== 'OK' && b.results === 'OK') return 1; return 0; }); rules: { SNCode: [ { required: true, message: '请è¾å ¥åºåå·', trigger: 'blur' } ] }, } }, methods: { async initLocationOptions() { try { const res = await listLocationInfo() this.locationCodeOptions = res.rows } catch (error) { this.$message.error('è·åå·¥ä½å表失败') } setFocus(){ this.$nextTick(()=>{ this.$refs.inputdata.focus() }) }, handleLocationChange(value) { if (!value) { this.prototypeNumber = '' this.materialCode = '' this.formulaTableData = [] return handleScannerInput(event){ if (this.scannerFlag){ this.form.SNCode = '' this.$refs.inputdata.value = '' this.scannerFlag = false } this.isFirstEnter = true this.prototypeNumber = '' this.materialCode = '' this.formulaTableData = [] }, async handleMaterialCodeEnter() { if (!this.locationCode) { this.$message.warning('请å 鿩工ä½') return } const input = event.target this.form.SNCode = input.value if (event.key === 'Enter'){ this.scannerFlag = true //æ«æå®æ addPassStationCollection({SNCode:this.form.SNCode,LocationCode: this.form.LocationCode}).then(res => { if (this.isFirstEnter) { this.prototypeNumber = this.materialCode this.materialCode = '' this.isFirstEnter = false try { const res = await listInfo({ locationCode: this.locationCode, pageFlag: true, }) console.log(res) this.formulaTableData = res.rows } catch (error) { this.$message.error('è·åé æ¹æ°æ®å¤±è´¥') } } else { try { const res = await updateCollectData({ locationCode: this.locationCode, inputValue: this.materialCode }) if (res.code === 200) { this.formulaTableData = res.data this.$message.success('æ´æ°æå') this.materialCode = '' // æ¸ ç©ºè¾å ¥æ¡ // 卿°æ®æ´æ°åï¼æ»å¨å°åéçä½ç½® this.$nextTick(() => { const table = this.$refs.formulaTable; const completedCount = this.sortedFormulaData.filter(item => item.results === 'OK').length; const totalCount = this.sortedFormulaData.length; if (completedCount < totalCount) { // 计ç®éè¦æ»å¨çä½ç½®ï¼å°ç¬¬ä¸ä¸ªæªå®æçè¡æ¾ç¤ºå¨ä¸é´ const rowHeight = 40; // é¢ä¼°çè¡é« const scrollPosition = completedCount * rowHeight - (table.$el.clientHeight / 2) + rowHeight; // è®¾ç½®è¡¨æ ¼çæ»å¨ä½ç½® table.bodyWrapper.scrollTop = Math.max(0, scrollPosition); } }); if (res.code === 200){ this.$message({ message: "æ«ç 宿", type: "success" }) } else { this.$message.warning(res.msg) this.$message({ message: "æ«ç é误ï¼è¯·éè¯", type: "error" }) } } catch (error) { this.$message.error('æ´æ°å¤±è´¥') } }) } }, // æ·»å è¡æ ·å¼æ¹æ³ tableRowClassName({row}) { if (row.results === 'OK') { return 'success-row' }, mounted() { console.log('00') this.setFocus(); this.$nextTick(() => { if (this.$refs.inputdata){ this.$refs.inputdata.addEventListener('keydown',this.handleScannerInput) } return '' }, test1(){ let scanValue = '0RSMB05A132E3AF3V0000001' if(scanValue.includes("0RSMB")){ this.$message.warning("æå"+scanValue) }else { this.$message.error('æ«ç è¯å«é误ç产ååºåå·'+scanValue+'è¯·éæ°æ«ç '); } } }) }, beforeDestroy() { this.$refs.inputdata.removeEventListener('keydown',this.handleScannerInput) } } </script> billion-ui/src/views/main/om/info/index.vue
@@ -2,22 +2,22 @@ <div class="app-container"> <div> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px"> <el-form-item label="å·¥åç¼å·" prop="workOrderNo"> <el-input v-model="queryParams.workOrderNo" placeholder="请è¾å ¥å·¥åç¼å·" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="订åç¼å·" prop="salesOrderCode"> <el-input v-model="queryParams.salesOrderCode" placeholder="请è¾å ¥è®¢åç¼å·" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <!-- <el-form-item label="å·¥åç¼å·" prop="workOrderNo">--> <!-- <el-input--> <!-- v-model="queryParams.workOrderNo"--> <!-- placeholder="请è¾å ¥å·¥åç¼å·"--> <!-- clearable--> <!-- @keyup.enter.native="handleQuery"--> <!-- />--> <!-- </el-form-item>--> <!-- <el-form-item label="订åç¼å·" prop="salesOrderCode">--> <!-- <el-input--> <!-- v-model="queryParams.salesOrderCode"--> <!-- placeholder="请è¾å ¥è®¢åç¼å·"--> <!-- clearable--> <!-- @keyup.enter.native="handleQuery"--> <!-- />--> <!-- </el-form-item>--> <el-form-item label="产åç¼å·" prop="productCode"> <el-input v-model="queryParams.productCode" @@ -26,16 +26,16 @@ @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="å·¥åç¶æ" prop="orderStatus"> <el-select v-model="queryParams.orderStatus" placeholder="è¯·éæ©å·¥åç¶æ" clearable> <el-option v-for="dict in dict.type.order_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <!-- <el-form-item label="å·¥åç¶æ" prop="orderStatus">--> <!-- <el-select v-model="queryParams.orderStatus" placeholder="è¯·éæ©å·¥åç¶æ" clearable>--> <!-- <el-option--> <!-- v-for="dict in dict.type.order_status"--> <!-- :key="dict.value"--> <!-- :label="dict.label"--> <!-- :value="dict.value"--> <!-- />--> <!-- </el-select>--> <!-- </el-form-item>--> <el-form-item style="float: right; margin-right: 90px"> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æç´¢</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">éç½®</el-button> @@ -88,25 +88,25 @@ v-hasPermi="['main:info:export']" >导åº</el-button> </el-col> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-receiving" size="mini" @click="handleReceive" >æ¥æ¶å·¥å</el-button> </el-col> <el-col :span="1.5"> <el-button type="primary" plain :disabled="multiple" icon="el-icon-magic-stick" size="mini" @click="handleCreate" >çæ</el-button> </el-col> <!-- <el-col :span="1.5">--> <!-- <el-button--> <!-- type="primary"--> <!-- plain--> <!-- icon="el-icon-receiving"--> <!-- size="mini"--> <!-- @click="handleReceive"--> <!-- >æ¥æ¶å·¥å</el-button>--> <!-- </el-col>--> <!-- <el-col :span="1.5">--> <!-- <el-button--> <!-- type="primary"--> <!-- plain--> <!-- :disabled="multiple"--> <!-- icon="el-icon-magic-stick"--> <!-- size="mini"--> <!-- @click="handleCreate"--> <!-- >çæ</el-button>--> <!-- </el-col>--> <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>--> </el-row> </div> @@ -114,32 +114,32 @@ <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="å·¥åç¼å·" align="center" prop="workOrderNo" width="120"> <template slot-scope="scope"> <a style="color: #7099F9" @click="orderDetail(scope.row.workOrderNo)" >{{scope.row.workOrderNo}} </a> <!-- <div @click="orderDetail(scope.row.workOrderNo)">{{scope.row.workOrderNo}}</div>--> </template> </el-table-column> <el-table-column label="订åç¼å·" align="center" prop="salesOrderCode" width="120"/> <!-- <el-table-column label="å·¥åç¼å·" align="center" prop="workOrderNo" width="120">--> <!-- <template slot-scope="scope">--> <!-- <a style="color: #7099F9" @click="orderDetail(scope.row.workOrderNo)" >{{scope.row.workOrderNo}}--> <!-- </a>--> <!--<!– <div @click="orderDetail(scope.row.workOrderNo)">{{scope.row.workOrderNo}}</div>–>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="订åç¼å·" align="center" prop="salesOrderCode" width="120"/>--> <el-table-column label="产åç¼å·" align="center" prop="productCode" width="180"/> <el-table-column label="产线ç¼å·" align="center" prop="lineCode" /> <!-- <el-table-column label="产线ç¼å·" align="center" prop="lineCode" />--> <el-table-column label="è®¡åæ°é" align="center" prop="planQty" /> <el-table-column label="计åå¼å§æ¶é´" align="center" prop="planStartTime" width="120"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.planStartTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="计åç»ææ¶é´" align="center" prop="planEndTime" width="120"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.planEndTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="å·¥åç¶æ" align="center" prop="orderStatus"> <template slot-scope="scope"> <dict-tag :options="dict.type.order_status" :value="scope.row.orderStatus"/> </template> </el-table-column> <!-- <el-table-column label="计åç»ææ¶é´" align="center" prop="planEndTime" width="120">--> <!-- <template slot-scope="scope">--> <!-- <span>{{ parseTime(scope.row.planEndTime, '{y}-{m}-{d}') }}</span>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="å·¥åç¶æ" align="center" prop="orderStatus">--> <!-- <template slot-scope="scope">--> <!-- <dict-tag :options="dict.type.order_status" :value="scope.row.orderStatus"/>--> <!-- </template>--> <!-- </el-table-column>--> <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> @@ -160,20 +160,29 @@ <!-- æ·»å æä¿®æ¹ç产工åå¯¹è¯æ¡ --> <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body> <el-form ref="form" :model="form" :rules="rules" label-width="120px"> <el-form-item label="å·¥åç¼å·" prop="workOrderNo"> <el-input v-model="form.workOrderNo" placeholder="请è¾å ¥å·¥åç¼å·" /> </el-form-item> <el-form-item label="订åç¼å·" prop="salesOrderCode"> <el-input v-model="form.salesOrderCode" placeholder="请è¾å ¥è®¢åç¼å·" /> </el-form-item> <!-- <el-form-item label="å·¥åç¼å·" prop="workOrderNo">--> <!-- <el-input v-model="form.workOrderNo" placeholder="请è¾å ¥å·¥åç¼å·" />--> <!-- </el-form-item>--> <!-- <el-form-item label="订åç¼å·" prop="salesOrderCode">--> <!-- <el-input v-model="form.salesOrderCode" placeholder="请è¾å ¥è®¢åç¼å·" />--> <!-- </el-form-item>--> <el-form-item label="产åç¼å·" prop="productCode"> <el-input v-model="form.productCode" placeholder="请è¾å ¥äº§åç¼å·" /> <el-select v-model="form.productCode" placeholder="è¯·éæ©äº§åç¼å·" clearable> <el-option v-for="dict in dict.type.product_type" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="产线ç¼å·" prop="lineCode"> <el-input v-model="form.lineCode" placeholder="请è¾å ¥äº§çº¿ç¼å·" /> </el-form-item> <!-- <el-form-item label="产线ç¼å·" prop="lineCode">--> <!-- <el-input v-model="form.lineCode" placeholder="请è¾å ¥äº§çº¿ç¼å·" />--> <!-- </el-form-item>--> <el-form-item label="è®¡åæ°é" prop="planQty"> <el-input v-model="form.planQty" placeholder="请è¾å ¥è®¡åæ°é" /> <el-input-number v-model="form.planQty" controls-position="right" :min="1" :max="10000"></el-input-number> </el-form-item> <el-form-item label="计åå¼å§æ¶é´" prop="planStartTime"> <el-date-picker clearable @@ -183,23 +192,23 @@ placeholder="è¯·éæ©è®¡åå¼å§æ¶é´"> </el-date-picker> </el-form-item> <el-form-item label="计åç»ææ¶é´" prop="planEndTime"> <el-date-picker clearable v-model="form.planEndTime" type="date" value-format="yyyy-MM-dd" placeholder="è¯·éæ©è®¡åç»ææ¶é´"> </el-date-picker> </el-form-item> <el-form-item label="å·¥åç¶æ" prop="orderStatus" v-if = updateFlag> <el-radio-group v-model="form.orderStatus"> <el-radio v-for="dict in dict.type.order_status" :key="dict.value" :label="dict.value" >{{dict.label}}</el-radio> </el-radio-group> </el-form-item> <!-- <el-form-item label="计åç»ææ¶é´" prop="planEndTime">--> <!-- <el-date-picker clearable--> <!-- v-model="form.planEndTime"--> <!-- type="date"--> <!-- value-format="yyyy-MM-dd"--> <!-- placeholder="è¯·éæ©è®¡åç»ææ¶é´">--> <!-- </el-date-picker>--> <!-- </el-form-item>--> <!-- <el-form-item label="å·¥åç¶æ" prop="orderStatus" v-if = updateFlag>--> <!-- <el-radio-group v-model="form.orderStatus">--> <!-- <el-radio--> <!-- v-for="dict in dict.type.order_status"--> <!-- :key="dict.value"--> <!-- :label="dict.value"--> <!-- >{{dict.label}}</el-radio>--> <!-- </el-radio-group>--> <!-- </el-form-item>--> <el-form-item label="夿³¨" prop="remarks"> <el-input type="textarea" @@ -216,56 +225,56 @@ <el-button @click="cancel">å æ¶</el-button> </div> </el-dialog> <el-dialog title="å·¥å详æ " :visible.sync="detailVisible" width="80%" center> <el-table v-loading="detailLoading" :data="schedulingList"> <el-table-column label="å·¥åç¼å·" align="center" prop="workOrderNo" /> <el-table-column label="æ»æåºåå·" width="180px" align="center" prop="sfcCode" /> <el-table-column label="产åç¼ç " align="center" prop="productCode" /> <el-table-column label="ä¸çº¿æ¶é´" align="center" prop="onlineTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.onlineTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> </template> </el-table-column> <el-table-column label="ä¸çº¿æ¶é´" align="center" prop="offlineTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.offlineTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> </template> </el-table-column> <el-table-column label="è´¨éç¶æ" align="center" prop="qualityStatus"> <template slot-scope="scope"> <dict-tag :options="dict.type.product_status" :value="scope.row.qualityStatus"/> </template> </el-table-column> <el-table-column label="ç¶æ" align="center" prop="status"> <template slot-scope="scope"> <dict-tag :options="dict.type.status" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="æ´æ°ç¨æ·" align="center" prop="updateBy" /> <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> </template> </el-table-column> <el-table-column label="夿³¨" width="180px" show-overflow-tooltip align="center" prop="remarks" /> </el-table> <!-- <el-dialog--> <!-- title="å·¥å详æ "--> <!-- :visible.sync="detailVisible"--> <!-- width="80%"--> <!-- center>--> <!-- <el-table v-loading="detailLoading" :data="schedulingList">--> <!-- <el-table-column label="å·¥åç¼å·" align="center" prop="workOrderNo" />--> <!-- <el-table-column label="æ»æåºåå·" width="180px" align="center" prop="sfcCode" />--> <!-- <el-table-column label="产åç¼ç " align="center" prop="productCode" />--> <!-- <el-table-column label="ä¸çº¿æ¶é´" align="center" prop="onlineTime" width="180">--> <!-- <template slot-scope="scope">--> <!-- <span>{{ parseTime(scope.row.onlineTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="ä¸çº¿æ¶é´" align="center" prop="offlineTime" width="180">--> <!-- <template slot-scope="scope">--> <!-- <span>{{ parseTime(scope.row.offlineTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="è´¨éç¶æ" align="center" prop="qualityStatus">--> <!-- <template slot-scope="scope">--> <!-- <dict-tag :options="dict.type.product_status" :value="scope.row.qualityStatus"/>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="ç¶æ" align="center" prop="status">--> <!-- <template slot-scope="scope">--> <!-- <dict-tag :options="dict.type.status" :value="scope.row.status"/>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="æ´æ°ç¨æ·" align="center" prop="updateBy" />--> <!-- <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" width="180">--> <!-- <template slot-scope="scope">--> <!-- <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>--> <!-- </template>--> <!-- </el-table-column>--> <!-- <el-table-column label="夿³¨" width="180px" show-overflow-tooltip align="center" prop="remarks" />--> <!-- </el-table>--> <pagination v-show="detailTotal>0" :total="detailTotal" :page.sync="queryDetailParams.pageNum" :limit.sync="queryDetailParams.pageSize" @pagination="getDetail" /> <span slot="footer" class="dialog-footer"> <!-- <el-button @click="detailVisible = false">å æ¶</el-button>--> <!-- <el-button type="primary" @click="detailVisible = false">ç¡® å®</el-button>--> </span> </el-dialog> <!-- <pagination--> <!-- v-show="detailTotal>0"--> <!-- :total="detailTotal"--> <!-- :page.sync="queryDetailParams.pageNum"--> <!-- :limit.sync="queryDetailParams.pageSize"--> <!-- @pagination="getDetail"--> <!-- />--> <!-- <span slot="footer" class="dialog-footer">--> <!--<!– <el-button @click="detailVisible = false">å æ¶</el-button>–>--> <!--<!– <el-button type="primary" @click="detailVisible = false">ç¡® å®</el-button>–>--> <!-- </span>--> <!-- </el-dialog>--> </div> </template> @@ -276,7 +285,7 @@ export default { name: "Info", dicts: ['order_status','product_status', 'status'], dicts: ['order_status','product_status', 'status', 'product_type'], data() { return { schedulingList: [], @@ -321,27 +330,27 @@ form: {}, // è¡¨åæ ¡éª rules: { workOrderNo: [ { required: true, message: "å·¥åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } ], salesOrderCode: [ { required: true, message: "订åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } ], // workOrderNo: [ // { required: true, message: "å·¥åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } // ], // salesOrderCode: [ // { required: true, message: "订åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } // ], productCode: [ { required: true, message: "产åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } ], lineCode: [ { required: true, message: "产线ç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } ], // lineCode: [ // { required: true, message: "产线ç¼å·ä¸è½ä¸ºç©º", trigger: "blur" } // ], planQty: [ { required: true, message: "è®¡åæ°éä¸è½ä¸ºç©º", trigger: "blur" } ], planStartTime: [ { required: true, message: "计åå¼å§æ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } ], planEndTime: [ { required: true, message: "计åç»ææ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } ], // planEndTime: [ // { required: true, message: "计åç»ææ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } // ], } }; }, @@ -449,6 +458,13 @@ }, /** æäº¤æé® */ submitForm() { if (this.form.planQty !== null && this.form.planQty !== ''){ var p = /^\d+$/ if (!p.test(this.form.planQty)){ this.$modal.msgError("æ°é请è¾å ¥æ£æ´æ°"); return } } this.$refs["form"].validate(valid => { if (valid) { if (this.form.id != null) {