Commit 18a2cf91 by yxdubhe_bot

merge:feature-changeFlow-221110:operator:hzhuyuanyuan@corp.netease.com:auto_bran…

merge:feature-changeFlow-221110:operator:hzhuyuanyuan@corp.netease.com:auto_branch_merge_by_branchService_end
parents f005b819 8e009370
include:
- project: tech/ci-operator
file: /yanxuan-qc-change-system/gitlab-ci.yml
ref: master
\ No newline at end of file
variables:
SERVICE_CODE: 'yanxuan-qc-change-system'
TARGET_FILE_PATH: './build' #目标文件所在的目录; 根据实际情况修改
TARGET_FILE_NAME: 'yanxuan-qc-change-system.jar' #目标文件的文件名,根据实际情况修改
ARTIFACT_NAME: 'yanxuan-qc-change-system.jar' #制品名, 主要是考虑目标文件和制品文件文件名不一致的情况;如果一致, 则和目标文件名一致
DEV_SETENV_FILE_PATH: './deploy/env/setenv-dev.sh' #开发环境setenv文件路径
TEST_SETENV_FILE_PATH: './deploy/env/setenv-test.sh' #测试环境setenv文件路径
ONLINE_SETENV_FILE_PATH: './deploy/env/setenv-online.sh' #线上环境setenv文件路径
stages:
- inspection
- unitTest
- package
- upload-bee
- upload
#inspection
#inspection-job:
# stage: inspection
# script:
# - ci_tools inspection $SERVICE_CODE $CI_COMMIT_REF_NAME $CI_PIPELINE_ID
# tags:
# - ci-backend
#unitTest-job:
# stage: unitTest
# script:
# - mvn clean org.jacoco:jacoco-maven-plugin:0.8.2:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.2:report -Dmaven.test.failure.ignore=true
# - ci_tools report_unit_test_result $TARGET_FILE_PATH/site/jacoco/jacoco.xml $SERVICE_CODE $CI_COMMIT_REF_NAME $CI_PIPELINE_ID
# tags:
# - ci-backend
################
# Test
################
test_package:
stage: package
script:
- mvn clean -U package -Ptest -Dmaven.test.skip=true -Dencoding=UTF-8
- mv $TARGET_FILE_PATH/$TARGET_FILE_NAME $ARTIFACT_NAME
- mv $TEST_SETENV_FILE_PATH ./setenv.sh
- zip $CI_PROJECT_NAME.zip ./setenv.sh $ARTIFACT_NAME
tags:
- ci-backend
artifacts:
paths:
- $CI_PROJECT_NAME.zip
- swagger/
expire_in: 1d
except:
- master
test_upload_bee:
stage: upload-bee
script:
- cd swagger
- beeUpload $SERVICE_CODE $CI_BUILD_REF_NAME $GITLAB_USER_NAME $GITLAB_USER_EMAIL
tags:
- ci-backend
except:
- master
dependencies:
- test_package
test_image_upload:
stage: upload
script:
- version_tools time && CURRENT_TIMESTAMP=$(version_tools result)
- version_tools version && PROJECT_VERSION=$(version_tools result)
- IMAGE_TAG="${PROJECT_VERSION}-${CI_COMMIT_REF_NAME##*/}-${CURRENT_TIMESTAMP}-${CI_PIPELINE_ID}"
- IMAGE_NAME="${HARBOR_URL}/${HARBOR_APP_DIRECTOR}/${SERVICE_CODE}:${IMAGE_TAG}"
- unzip -o -q $CI_PROJECT_NAME.zip -d .
- docker build --pull -t ${IMAGE_NAME} .
- eval opera docker $OPERA_ARGS --env=test --imageName=${IMAGE_NAME} --imageTag=${IMAGE_TAG} --autoDeploy=true --clusterId=44 --ldcCode=cluster1
tags:
- ci-backend
only:
- dev
- /^feature-.*$/
dependencies:
- test_package
################
# Online
################
online_package:
stage: package
script:
- mvn clean -U package -Ponline -Dmaven.test.skip=true -Dencoding=UTF-8
- mv $TARGET_FILE_PATH/$TARGET_FILE_NAME $ARTIFACT_NAME
- mv $ONLINE_SETENV_FILE_PATH ./setenv.sh
- zip $CI_PROJECT_NAME.zip ./setenv.sh $ARTIFACT_NAME
tags:
- ci-backend
artifacts:
paths:
- $CI_PROJECT_NAME.zip
- swagger/
expire_in: 1d
only:
- master
online_upload_bee:
stage: upload-bee
script:
- cd swagger
- beeUpload $SERVICE_CODE $CI_BUILD_REF_NAME $GITLAB_USER_NAME $GITLAB_USER_EMAIL
tags:
- ci-backend
only:
- master
dependencies:
- online_package
online_image_upload:
stage: upload
script:
- version_tools time && CURRENT_TIMESTAMP=$(version_tools result)
- version_tools version && PROJECT_VERSION=$(version_tools result)
- IMAGE_TAG="${PROJECT_VERSION}-${CI_COMMIT_REF_NAME##*/}-${CURRENT_TIMESTAMP}-${CI_PIPELINE_ID}"
- IMAGE_NAME="${HARBOR_URL}/${HARBOR_APP_DIRECTOR}/${SERVICE_CODE}:${IMAGE_TAG}"
- unzip -o -q $CI_PROJECT_NAME.zip -d .
- docker build -t ${IMAGE_NAME} .
- eval opera docker $OPERA_ARGS --env=online --imageName=${IMAGE_NAME} --imageTag=${IMAGE_TAG}
tags:
- ci-backend
only:
- master
dependencies:
- online_package
java_home=/home/petools/packages/jdk1.8.0_91
jvm_opts_property="-Dspring.profiles.active=online -Dserver.port=8080"
consul_service_port=8080
consul_service_tags=online
consul_health_url="/yanxuan-qc-change-system/i/health"
java_home=/home/petools/packages/jdk1.8.0_91
jvm_opts_property="-Dspring.profiles.active=test -Dserver.port=8080"
consul_service_port=8080
consul_service_tags=test
consul_health_url="/yanxuan-qc-change-system/i/health"
CREATE TABLE `TB_YX_QC_CHANGE_CONFIG`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`change_subject` int(11) NOT NULL DEFAULT '0' COMMENT '变更主体',
`parent_change_class_id` int(11) NOT NULL DEFAULT '0' COMMENT '一级变更类型id',
`son_change_class_id` int(11) NOT NULL DEFAULT '0' COMMENT '二级变更类型id',
`change_level` int(11) NOT NULL DEFAULT '0' COMMENT '变更等级',
`change_department` varchar(20) NOT NULL DEFAULT '' COMMENT '变更负责部门名',
`participate_change_exec_department` varchar(255) NOT NULL DEFAULT '' COMMENT '变更行动部门列表',
`change_commander_type` int(11) NOT NULL DEFAULT '0' COMMENT '变更负责人类型',
`change_commander` varchar(50) NOT NULL DEFAULT '' COMMENT '变更负责人详情(不同类型存储不同内容)',
`need_file` int(11) NOT NULL DEFAULT '0' COMMENT '是否需要资料上传',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更类型配置表';
CREATE TABLE `TB_YX_QC_CHANGE_EXEC_CONFIG`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`change_template_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '变更类型配置记录id',
`change_exec_department` varchar(20) NOT NULL DEFAULT '' COMMENT '变更执行部门名',
`change_exec_user_type` int(11) NOT NULL DEFAULT '0' COMMENT '变更行动人类型',
`change_exec_user` varchar(20) NOT NULL DEFAULT '' COMMENT '变更行动人(不同类型存储不同内容)',
`change_risk_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '变更风险描述',
`change_exec_project` varchar(550) NOT NULL DEFAULT '' COMMENT '行动项',
`change_checking` varchar(550) NOT NULL DEFAULT '' COMMENT '变更验证措施',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更类型配置行动方案配置表';
CREATE TABLE `TB_YX_QC_CHANGE_TYPE`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`type_name` varchar(20) NOT NULL DEFAULT '' COMMENT '类型名',
`parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父类id',
`delete_type` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='变更类型表';
CREATE TABLE `TB_YX_QC_CHANGE_RECORD`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`flow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '工单id',
`flow_node` varchar(20) NOT NULL DEFAULT '' COMMENT '工单当前节点',
`change_subject` int(11) NOT NULL DEFAULT '0' COMMENT '变更主体',
`parent_change_class_id` int(11) NOT NULL DEFAULT '0' COMMENT '一级变更类型id',
`son_change_class_id` int(11) NOT NULL DEFAULT '0' COMMENT '二级变更类型id',
`change_level` int(11) NOT NULL DEFAULT '0' COMMENT '变更等级',
`change_commander` varchar(70) NOT NULL DEFAULT '' COMMENT '变更负责人',
`change_department` varchar(20) NOT NULL DEFAULT '' COMMENT '变更负责部门名',
`participate_change_exec_department` varchar(255) NOT NULL DEFAULT '' COMMENT '变更行动部门列表,JSON格式',
`change_item` varchar(1020) NOT NULL DEFAULT '' COMMENT '变更商品(变更主体为商品时有效)',
`change_supplier` varchar(20) NOT NULL DEFAULT '' COMMENT '变更供应商(变更主体为供应商时有效)',
`change_reason` varchar(550) NOT NULL DEFAULT '' COMMENT '变更原因',
`change_content` varchar(550) NOT NULL DEFAULT '' COMMENT '变更内容',
`change_risk_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '变更潜在风险描述',
`change_checking` varchar(550) NOT NULL DEFAULT '' COMMENT '变更验证措施',
`change_profit` int(11) NOT NULL DEFAULT '0' COMMENT '变更收益',
`change_profit_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '变更收益说明',
`change_confirm_result_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '变更结果确认时间',
`state` int(2) NOT NULL DEFAULT '0' COMMENT '工单状态,1进行中,2取消完结,3延期,4正常完结',
`cancel_reason` varchar(550) NOT NULL DEFAULT '' COMMENT '取消原因',
`change_result` int(2) NOT NULL DEFAULT '0' COMMENT '变更结论',
`create_source` int(2) NOT NULL DEFAULT '0' COMMENT '创建端(普通or同舟)',
`create_supplier` varchar(20) NOT NULL DEFAULT '' COMMENT '创建人所属供应商(同舟创建)',
`change_result_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '结论说明',
`remark` varchar(550) NOT NULL DEFAULT '' COMMENT '备注',
`creator` varchar(50) NOT NULL DEFAULT '' COMMENT '创建人邮箱',
`auto_submit_email` int(2) NOT NULL DEFAULT '0' COMMENT '自动提交发送邮件',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `key_flow_id` (`flow_id`) USING BTREE COMMENT '变更工单id普通索引',
KEY `key_email` (`auto_submit_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更工单记录表'
CREATE TABLE `TB_YX_QC_CHANGE_FILE`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`change_record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '变更记录id',
`file_type` int(2) NOT NULL DEFAULT '0' COMMENT '文件类型(基础信息图片/基础信息视频/基础信息资料/变更结果资料)',
`file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名称',
`file_url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件地址',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `key_record_id` (`change_record_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='附件表';
CREATE TABLE `TB_YX_QC_CHANGE_EXEC_RECORD`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`change_record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '变更记录id',
`change_exec_department` varchar(50) NOT NULL DEFAULT '' COMMENT '变更执行部门名',
`change_exec_user_type` int(2) NOT NULL DEFAULT '0' COMMENT '变更行动人类型',
`change_exec_user` varchar(50) NOT NULL DEFAULT '' COMMENT '变更行动人(不同类型存储不同内容)',
`change_exec_user_email` varchar(60) NOT NULL DEFAULT '' COMMENT '变更行动人邮箱',
`change_risk_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '变更风险描述',
`change_exec_project` varchar(550) NOT NULL DEFAULT '' COMMENT '行动项',
`change_checking` varchar(550) NOT NULL DEFAULT '' COMMENT '变更措施验证',
`change_exec_finish_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '行动完成时间',
`change_exec_finish_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '行动完成情况',
`create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT ' 更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更类型行动方案记录表';
\ No newline at end of file
......@@ -39,6 +39,7 @@
<tracer.version>1.0.8-RELEASE</tracer.version>
<shadow.version>1.0.6-RELEASE</shadow.version>
<netease.ddb.version>4.6.0.4</netease.ddb.version>
<user-info-client.version>1.0.2-RELEASE</user-info-client.version>
<!-- store-db -->
<mysql.version>5.1.34</mysql.version>
......@@ -59,7 +60,8 @@
<commonsio.version>2.4</commonsio.version>
<commonscollection.version>4.1</commonscollection.version>
<commons.lang.version>2.4</commons.lang.version>
<des.version>1.0.2-SNAPSHOT</des.version>
<mapstruct.version>1.3.1.Final</mapstruct.version>
</properties>
<!-- 子模块可选依赖 -->
......@@ -126,12 +128,6 @@
</dependency>
<dependency>
<groupId>com.netease.yanxuan.missa</groupId>
<artifactId>missa-client</artifactId>
<version>${missa.client.version}</version>
</dependency>
<dependency>
<groupId>com.netease.mail.yanxuan</groupId>
<artifactId>eudemon-all</artifactId>
<version>${eudemon.version}</version>
......@@ -200,10 +196,17 @@
<artifactId>spring-data-redis</artifactId>
<version>${spring.data.redis.version}</version>
</dependency>
<dependency>
<groupId>com.netease.yanxuan</groupId>
<artifactId>user-ula-sdk</artifactId>
<version>1.0.13-RELEASE</version>
</dependency>
<dependency>
<groupId>netease.ddb</groupId>
<artifactId>db</artifactId>
<version>${netease.ddb.version}</version>
<groupId>com.netease.yanxuan</groupId>
<artifactId>user-info-client</artifactId>
<version>${user-info-client.version}</version>
</dependency>
</dependencies>
......@@ -233,10 +236,33 @@
<artifactId>apolloY-client</artifactId>
</dependency>
<dependency>
<groupId>com.netease.yanxuan</groupId>
<artifactId>user-ula-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.netease.yanxuan</groupId>
<artifactId>user-info-client</artifactId>
</dependency>
<!--默认引入missa-->
<dependency>
<groupId>com.netease.yanxuan.missa</groupId>
<artifactId>missa-client</artifactId>
<version>${missa.client.version}</version>
</dependency>
<dependency>
<groupId>com.netease.mail</groupId>
<artifactId>yx-openid-login</artifactId>
<version>1.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--其他严选中间件依赖包按需添加-->
......@@ -349,6 +375,104 @@
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<!--mybatis 分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.netease.yanxuan.flowx</groupId>
<artifactId>yanxuan-flowx-sdk</artifactId>
<version>1.4</version>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.netease.mail.yanxuan</groupId>
<artifactId>dschedule-boot-starter</artifactId>
<version>1.0.6-RELEASE</version>
<exclusions>
<exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>2.7.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>2.7.0</version>-->
<!-- </dependency>-->
<!--qc -->
<!--<dependency>-->
<!-- <groupId>com.netease.yanxuan</groupId>-->
<!-- <artifactId>yanxuan-qc-service-client</artifactId>-->
<!-- <version>2.0.0-SNAPSHOT</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!-- <groupId>com.netease.yanxuan</groupId>-->
<!-- <artifactId>yanxuan-qc-business-lib</artifactId>-->
<!-- <version>2.0.0-SNAPSHOT</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!-- <groupId>com.netease.yanxuan</groupId>-->
<!-- <artifactId>yanxuan-qc-parent</artifactId>-->
<!-- <version>2.0.0-SNAPSHOT</version>-->
<!--</dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.netease.mail.yanxuan</groupId>-->
<!-- <artifactId>dschedule-boot-starter</artifactId>-->
<!-- <version>1.0.3-SNAPSHOT</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.netease.mailsaas</groupId>-->
<!-- <artifactId>saas-kit-java-bundle</artifactId>-->
<!-- <version>0.1.0-SNAPSHOT</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.assertj</groupId>-->
<!-- <artifactId>assertj-core</artifactId>-->
<!-- <version>3.18.1</version>-->
<!-- </dependency>-->
<!--easypoi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.netease.mail.dp</groupId>
<artifactId>des-boot-starter</artifactId>
<version>${des.version}</version>
</dependency>
</dependencies>
<repositories>
......@@ -437,5 +561,14 @@
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources/config/${env}</directory>
</resource>
</resources>
</build>
</project>
\ No newline at end of file
......@@ -18,6 +18,53 @@
</dependency>
</dependencies>
<!-- profiles -->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
<profileActive>dev</profileActive>
<env.resource.directory>src/main/resources/config/dev</env.resource.directory>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
<profileActive>test</profileActive>
<env.resource.directory>src/main/resources/config/test</env.resource.directory>
</properties>
</profile>
<profile>
<id>regression</id>
<properties>
<env>regression</env>
<profileActive>regression</profileActive>
<env.resource.directory>src/main/resources/config/regression</env.resource.directory>
</properties>
</profile>
<profile>
<id>online</id>
<properties>
<env>online</env>
<profileActive>online</profileActive>
<env.resource.directory>src/main/resources/config/online</env.resource.directory>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<env>release</env>
<profileActive>online</profileActive>
<env.resource.directory>src/main/resources/config/release</env.resource.directory>
</properties>
</profile>
</profiles>
<build>
<finalName>yanxuan-qc-change-system</finalName>
<directory>../build</directory>
......
package com.netease.mail.yanxuan.change.assembly;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import com.netease.yanxuan.missa.client.annotation.EnableMissaClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import com.netease.yanxuan.missa.client.annotation.EnableMissaClients;
import tk.mybatis.spring.annotation.MapperScan;
/**
* 项目启动类
*/
@ComponentScan(basePackages = "com.netease.mail.yanxuan.change")
@ComponentScan(basePackages = {"com.netease.mail.yanxuan.change", "com.netease.yanxuan.user", "com.netease.mail.yanxuan.qc"})
@MapperScan("com.netease.mail.yanxuan.change.dal.mapper")
@EnableApolloConfig
@EnableMissaClients(basePackages = "com.netease.mail.yanxuan.change")
@SpringBootApplication
......
dschedule.enable=true
dschedule.env=test
dschedule.app-id=yanxuan-sc-ehc
dschedule.job-group=235
dschedule.enable-auto-register=true
dschedule.executor-fail-strategy=fail_alarm
dschedule.alarm-email=wb.tanglongwei@mesg.corp.netease.com
dschedule.adminAddresses=http://127.0.0.1:8550/proxy/test.dschedule-admin.service.mailsaas/
spring.http.multipart.max-file-size=100MB
spring.http.multipart.max-request-size=100MB
# mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/change_config?useUnicode=true&characterEncoding=UTF-8&autoReconnet=true
spring.datasource.username=root
spring.datasource.password=abc123
#tomcat
server.tomcat.max-threads=600
server.tomcat.uri-encoding=UTF-8
server.tomcat.basedir=/home/logs/access
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %{X-Forwarded-For}i %D %{P_INFO}c %{Referer}i %{User-Agent}i %{Host}i
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.configuration.cache-enabled=true
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# redis
spring.redis.pool.max-active=50
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.pool.max-wait=10000
spring.redis.pool.max-idle=20
spring.redis.timeout=20000
jvm_opts_base="-cp . -ea -Xms4096m -Xmx4096m"
jvm_opts_gc="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=15 -XX:InitiatingHeapOccupancyPercent=45 -XX:MaxTenuringThreshold=7 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=368m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs/yanxuan-sc-ehc -XX:-OmitStackTraceInFastThrow -Xloggc:/home/logs/yanxuan-sc-ehc/gc-%t.log"
jvm_opts_property="-Dspring.profiles.active=test -Denv=test -Dserver.port=8080"
jvm_opts_ext="-javaagent:/home/caesar-agent/caesar-agent-router-1.0.0.jar -Dapp.id=yanxuan-sc-ehc"
consul_service_tags=test
consul_service_port=8080
consul_health_url="/i/health"
consul_service_name="yanxuan-sc-ehc"
env=online
dschedule.enable=true
dschedule.env=online
dschedule.app-id=yanxuan-sc-ehc
dschedule.job-group=375
dschedule.enable-auto-register=true
dschedule.executor-fail-strategy=fail_alarm
dschedule.alarm-email=wb.tanglongwei@mesg.corp.netease.com
dschedule.adminAddresses=http://10.200.169.73:8080,http://10.200.169.74:8080,http://10.200.169.75:8080,http://10.200.169.76:8080,http://10.200.169.77:8080
spring.http.multipart.max-file-size=100MB
spring.http.multipart.max-request-size=100MB
#mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.130.72.182:4306/hd_qc_ecr?useUnicode=true&characterEncoding=UTF-8&autoReconnet=true
spring.datasource.username=hd_qc_ecr
spring.datasource.password=hd_qc_ecr
#tomcat
server.tomcat.max-threads=600
server.tomcat.uri-encoding=UTF-8
server.tomcat.basedir=/home/logs/access
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %{X-Forwarded-For}i %D %{P_INFO}c %{Referer}i %{User-Agent}i %{Host}i
mapper.style=normal
mapper.enum-as-simple-type=true
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.configuration.cache-enabled=true
mybatis.configuration.map-underscore-to-camel-case=true
# redis
spring.redis.password=BC6AYgWOXuJetuJG
spring.redis.timeout=20000
spring.redis.sentinel.master=paas-redis/yx-sc-ehc-onl
spring.redis.sentinel.nodes=yx-cust23-online.ncr.cn-east-p1.internal.:32427
spring.redis.pool.max-active=50
spring.redis.pool.max-idle=20
spring.redis.pool.max-wait=10000
spring.redis.host=yx-cust23-online.ncr.cn-east-p1.internal.
spring.redis.port=32427
# supplier
supplier.url=http://127.0.0.1:8550/proxy/test-v1.yanxuan-supplier-ms.service.mailsaas
### des\u914D\u7F6E
# \u5BFC\u51FA\u6587\u4EF6\u4E0A\u4F20\u5230\u54EA\u4E2A\u670D\u52A1\u5668\uFF0C\u6709test\u548Conline\u53EF\u9009
des.prop.env=online
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
<contextName>yanxuan-sc-ehc</contextName>
<include resource="logback-missa.xml"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="log.productName" value="yanxuan-qc-change-system"/>
<property name="log.path" value="/home/logs"/>
<property name="log.path.holmes" value="/home/logs/holmes"/>
<property name="log.level" value="info"/>
<property name="log.pattern"
value="{time=%d{yyyy-MM-dd HH:mm:ss.SSS}, traceId=%X{XTraceId}, level=%p} [%c{0}] %m%n"/>
<!-- custom coloring conversion -->
<conversionRule conversionWord="highlightex"
converterClass="com.netease.mail.yanxuan.qc.api.common.common.HighlightingCompositeConverterEx"/>
<!--appender-->
<appender name="query-internal" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/query.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
</appender>
<appender name="query" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="query-internal"/>
</appender>
<appender name="stdout-internal"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/stdout.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
</appender>
<appender name="stdout" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="stdout-internal"/>
</appender>
<appender name="holmes-appender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%msg</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path.holmes}/${log.productName}/yanxuan.${log.productName}.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<appender name="rpc" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/rpc.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
</appender>
<appender name="stderr"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/stderr.log.%d{yyyy-MM-dd}
</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="HELIOS-COMMON-APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%c{0}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/helios-common.log.%d{yyyy-MM-dd}.gz
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="HELIOS-STATS-APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%c{0}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/helios-stats.log.%d{yyyy-MM-dd}.gz
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="HELIOS-PROFILER-APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%c{0}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/helios-profile.log.%d{yyyy-MM-dd}.gz
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="HELIOS-SCHEDULE-JOB"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%t] [%c{0}] [%X{PtxId}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${log.path}/${log.productName}/helios-schedule.log.%d{yyyy-MM-dd}-%i.gz
</fileNamePattern>
<!-- each file should be at most 30MB, keep 60 days worth of history, but at most 2GB -->
<maxFileSize>30MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="helios-biz-appender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%msg</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/biz.helios.log.%d{yyyy-MM-dd}.gz
</fileNamePattern>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>21</maxHistory>
</rollingPolicy>
</appender>
<appender name="async-helios-biz-appender"
class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1024</queueSize>
<appender-ref ref="helios-biz-appender"/>
</appender>
<appender name="ASYNC-HELIOS-SCHEDULE-JOB"
class="ch.qos.logback.classic.AsyncAppender">
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<appender-ref ref="HELIOS-SCHEDULE-JOB"/>
</appender>
<logger name="HELIOS_SCHEDULE" additivity="false" level="info">
<appender-ref ref="ASYNC-HELIOS-SCHEDULE-JOB"/>
</logger>
<logger name="HELIOS_COMMON" level="${log.level}" additivity="false">
<appender-ref ref="HELIOS-COMMON-APPENDER"/>
</logger>
<logger name="HELIOS_STATS" level="${log.level}"
additivity="false">
<appender-ref ref="HELIOS-STATS-APPENDER"/>
</logger>
<logger name="HELIOS_PROFILER" level="${log.level}"
additivity="false">
<appender-ref ref="HELIOS-PROFILER-APPENDER"/>
</logger>
<logger name="net.sf.ehcache.pool.impl.DefaultSizeOfEngine" level="error"/>
<logger name="net.sf.ehcache.pool.sizeof.ObjectGraphWalker" level="error"/>
<logger name="com.netease.mail.yanxuan.ehc.core.meta.bean.rpc" additivity="false" level="info">
<appender-ref ref="rpc"/>
<appender-ref ref="stderr"/>
</logger>
<!--logger-->
<logger name="com.netease" additivity="false" level="${log.level}">
<appender-ref ref="query"/>
</logger>
<logger name="holmes-logger" level="info">
<appender-ref ref="holmes-appender"/>
</logger>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="stdout"/>
<appender-ref ref="stderr"/>
</root>
</configuration>
jvm_opts_base="-cp . -ea -Xms8192m -Xmx8192m"
jvm_opts_gc="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=15 -XX:InitiatingHeapOccupancyPercent=45 -XX:MaxTenuringThreshold=7 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=368m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs/yanxuan-sc-ehc -XX:-OmitStackTraceInFastThrow -Xloggc:/home/logs/yanxuan-sc-ehc/gc-%t.log"
jvm_opts_property="-Dspring.profiles.active=online -Denv=online -Dserver.port=8080"
jvm_opts_ext="-javaagent:/home/caesar-agent/caesar-agent-router-1.0.0.jar -Dapp.id=yanxuan-sc-ehc"
consul_service_tags=online
consul_service_port=8080
consul_service_name="yanxuan-sc-ehc"
consul_health_url="/i/health"
env=test
dschedule.enable=true
dschedule.env=test
dschedule.app-id=yanxuan-qc-change-system
dschedule.job-group=736
dschedule.enable-auto-register=true
dschedule.executor-fail-strategy=fail_alarm
dschedule.alarm-email=wb.tanglongwei@mesg.corp.netease.com
dschedule.adminAddresses=http://127.0.0.1:8550/proxy/test.dschedule-admin.service.mailsaas/
spring.http.multipart.max-file-size=100MB
spring.http.multipart.max-request-size=100MB
# mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.170.155.148:4306/qc_ecr_system?useUnicode=true&characterEncoding=UTF-8&autoReconnet=true
spring.datasource.username=qc_ecr_system
spring.datasource.password=qc_ecr_system
#tomcat
server.tomcat.max-threads=600
server.tomcat.uri-encoding=UTF-8
server.tomcat.basedir=/home/logs/access
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %{X-Forwarded-For}i %D %{P_INFO}c %{Referer}i %{User-Agent}i %{Host}i
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.configuration.cache-enabled=true
mybatis.configuration.map-underscore-to-camel-case=true
# redis
spring.redis.password=xc0CdqWMzMj6hBvpIY5HrciHX85txmftyXukMnyKdK8X
spring.redis.timeout=20000
spring.redis.sentinel.master=paas-redis/yx-common-repl-1-test
spring.redis.sentinel.nodes=yx-cust23-test.ncr.cn-east-p1.internal:31461
spring.redis.pool.max-active=50
spring.redis.pool.max-idle=20
spring.redis.pool.max-wait=10000
spring.redis.host=yx-cust23-test.ncr.cn-east-p1.internal
spring.redis.port=31461
# supplier
supplier.url=http://127.0.0.1:8550/proxy/test-v1.yanxuan-supplier-ms.service.mailsaas
### des\u914D\u7F6E
# \u5BFC\u51FA\u6587\u4EF6\u4E0A\u4F20\u5230\u54EA\u4E2A\u670D\u52A1\u5668\uFF0C\u6709test\u548Conline\u53EF\u9009
des.prop.env=test
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
<contextName>yanxuan-sc-ehc</contextName>
<include resource="logback-missa.xml"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="log.productName" value="yanxuan-qc-change-system"/>
<property name="log.path" value="/home/logs"/>
<property name="log.path.holmes" value="/home/logs/holmes"/>
<property name="log.level" value="debug"/>
<property name="log.pattern"
value="{time=%d{yyyy-MM-dd HH:mm:ss.SSS}, traceId=%X{XTraceId}, level=%p} [%c{0}] %m%n"/>
<!-- custom coloring conversion -->
<conversionRule conversionWord="highlightex"
converterClass="com.netease.mail.yanxuan.qc.api.common.common.HighlightingCompositeConverterEx"/>
<!--appender-->
<appender name="query-internal" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/query.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>90</maxHistory>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!-- &lt;!&ndash; maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 &ndash;&gt;-->
<!-- <maxFileSize>500MB</maxFileSize>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
</rollingPolicy>
</appender>
<appender name="query" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="query-internal"/>
</appender>
<appender name="stdout-internal"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/stdout.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
</appender>
<appender name="stdout" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>true</includeCallerData>
<appender-ref ref="stdout-internal"/>
</appender>
<appender name="holmes-appender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%msg</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path.holmes}/${log.productName}/yanxuan.${log.productName}.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<appender name="rpc" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/rpc.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
</appender>
<appender name="task" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/task.log.%d{yyyy-MM-dd}
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="stderr"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.productName}/stderr.log.%d{yyyy-MM-dd}
</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 定时任务 -->
<appender name="dschedule"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%c{0}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/dschedule.log.%d{yyyy-MM-dd}.gz
</fileNamePattern>
</rollingPolicy>
</appender>
<logger name="com.netease.mail.yanxuan.change.integration" additivity="false" level="${log.level}">
<appender-ref ref="rpc"/>
<appender-ref ref="stderr"/>
</logger>
<logger name="com.netease.mail.yanxuan.change" additivity="false" level="${log.level}">
<appender-ref ref="query"/>
<appender-ref ref="stderr"/>
</logger>
<!-- 日志输出级别 -->
<root level="${log.level}">
<appender-ref ref="stdout"/>
<appender-ref ref="stderr"/>
</root>
</configuration>
jvm_opts_base="-cp . -ea -Xms4096m -Xmx4096m"
jvm_opts_gc="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=15 -XX:InitiatingHeapOccupancyPercent=45 -XX:MaxTenuringThreshold=7 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=368m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs/yanxuan-sc-ehc -XX:-OmitStackTraceInFastThrow -Xloggc:/home/logs/yanxuan-sc-ehc/gc-%t.log"
jvm_opts_property="-Dspring.profiles.active=test -Denv=test -Dserver.port=8080"
jvm_opts_ext="-javaagent:/home/caesar-agent/caesar-agent-router-1.0.0.jar -Dapp.id=yanxuan-sc-ehc"
consul_service_tags=test
consul_service_port=8080
consul_health_url="/i/health"
consul_service_name="yanxuan-sc-ehc"
/**
* @(#)AppConfig.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.config;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ctrip.framework.apollo.spring.annotation.EnableAutoUpdateApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ValueMapping;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/11/14
*/
@Component
@EnableAutoUpdateApolloConfig("application")
@Data
public class AppConfig {
@ValueMapping("${titleConfig:null}")
private TitleConfig titleConfig;
@Value("${changeExecLimit:20}")
private Integer changeExecLimit;
@Value("${testEmail:A@163.com}")
private String testEmail;
@Value("${sendEmail:[\"wb.wangzhichao01@mesg.corp.netease.com\"]}")
private List<String> receiver;
@Value("${change.goods.principal.name:aaa}")
private String defaultName;
@Value("${change.goods.principal.email:grp.gyhtest1001@corp.netease.com}")
private String defaultEmail;
@Value("${searchName:aa}")
private String searchName;
@Value("${searchUid:wb.mulongfei@mesg.corp.netease.com}")
private String searchUid;
/**
* 变更管理QM
*/
@Value("${changeManageQM:cuiyixian@corp.netease.com}")
private String changeManageQM;
/**
* 变更管理委员会
*/
@Value("${changeCommittee:yx_change_SC@qun.mail.163.com}")
private String changeCommittee;
@Value("${exportLimit:20}")
private Long exportLimit;
}
\ No newline at end of file
/**
* @(#)TitleConfig.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.config;
import java.util.List;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/11/14
*/
@Data
public class TitleConfig {
/**
* 提示文案
*/
private String title;
/**
* 文件
*/
private List<TitleFileConfig> files;
}
\ No newline at end of file
/**
* @(#)ChangeFileConfig.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.config;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/11/14
*/
@Data
public class TitleFileConfig {
/**
* 文件链接
*/
private String fileUrl;
/**
* 文件名
*/
private String fileName;
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.biz.meta.exception;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
/**
* @author: bndong
* @date: 2021/5/25
*/
public class ExceptionFactory {
public static ServiceException createBiz(ResponseCode resCode) {
return new ServiceException(resCode);
}
public static ServiceException createBiz(ResponseCode resCode, String message) {
return new ServiceException(resCode, message);
}
public static ServiceException createNotLogin() {
return createBiz(ResponseCode.NOT_LOGIN);
}
public static ServiceException createParamFail() {
return createBiz(ResponseCode.BAD_REQUEST);
}
}
package com.netease.mail.yanxuan.change.biz.meta.exception;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
/**
* @author: bndong
* @date: 2021/5/25
*/
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 2531549421457088715L;
private ResponseCode code = ResponseCode.SUCCESS;
private String msg;
public ServiceException(ResponseCode code, String msg) {
super("code:" + code + ",msg:" + msg);
this.msg = msg;
this.code = code;
}
public ServiceException(ResponseCode code) {
super("code:" + code.getCode() + ",msg:" + code.getMsg());
this.code = code;
this.msg = code.getMsg();
}
public ResponseCode getCode() {
return code;
}
public int getIntCode() {
return code.getCode();
}
public void setCode(ResponseCode code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
/**
* @(#)ChangeFileService.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service;
import java.util.List;
import com.netease.mail.yanxuan.change.common.enums.FileTypeEnum;
import com.netease.mail.yanxuan.change.dal.entity.ChangeFile;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowFile;
/**
* @Author zcwang
* @Date 2022/11/21
*/
public interface ChangeFileService {
/**
* 获取工单对应的附件
* @param changeRecordId
* @return
*/
List<ChangeFlowFile> getChangeFileList(Long changeRecordId);
void batchSaveRecord(List<ChangeFile> changeFiles);
Integer deleteByChangeRecordId(Long changeRecordId);
void saveRecord(ChangeFile changeFile);
void deleteByChangeRecordIdAndType(Long changeRecordId, FileTypeEnum type);
}
\ No newline at end of file
/**
* @(#)ChangeFlowExecService.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service;
import java.util.List;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO;
/**
* @Author zcwang
* @Date 2022/11/21
*/
public interface ChangeFlowExecService {
/**
* 查询行动项
* @param changeRecordId
* @return
*/
List<ChangeFlowExecVO> getChangeFlowExecRecord(Long changeRecordId);
/**
* 批量保存变更行动执行记录
* @param changeExecRecordList
*/
void batchSaveRecord(List<ChangeExecRecord> changeExecRecordList);
Boolean update(ChangeExecRecord exec);
Integer deleteByChangeRecordId(Long id);
void saveRecord(ChangeExecRecord exec);
}
\ No newline at end of file
/**
* @(#)ChangeFlowExportQuery.java, 2022/12/8.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service;
import com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Data
public class ChangeFlowExportQuery {
/**
* 变更商品(变更主体为商品时有效)
*/
private String itemId;
/**
* 变更供应商(变更主体为供应商时有效)
*/
private String supplier;
/**
* 一级变更类型id
*/
private Long parentChangeClassId;
/**
* 二级变更类型id
*/
private Long sonChangeClassId;
/**
* 工单状态
*/
private Integer changeState;
/**
* 变更负责人
*/
private String changeCommander;
/**
* 变更负责部门名
*/
private String changeDepartment;
/**
* 变更行动部门
*/
private String changeExecDepartment;
/**
* 开始时间
*/
private Long startTime;
/**
* 结束时间
*/
private Long endTime;
/**
* 创建端
* @see CreateSourceEnum
*/
private Integer createSource;
/**
* 服务编码 yanxuan-qc-change-flow
*/
protected String serviceCode;
/**
* 登录用户
*/
protected String uid;
private Long limit;
private Long offset;
}
\ No newline at end of file
/**
* @(#)ChangeFlowService.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service;
import java.util.List;
import com.netease.mail.yanxuan.change.biz.config.TitleConfig;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
/**
* @Author zcwang
* @Date 2022/11/14
*/
public interface ChangeFlowService {
/**
* 获取提示文案
* @return
*/
TitleConfig getTitleConfig();
/**
* 保存工单详情
* @param changeRecord
* @return
*/
Boolean saveRecord(ChangeRecord changeRecord);
/**
* 根据工单id查询
* @param flowId
* @return
*/
ChangeRecord getByFlowId(Long flowId);
/**
* 更新工单信息
* @param changeRecord
* @return
*/
Boolean updateRecord(ChangeRecord changeRecord);
/**
* 根据实例id获取工单详情
* @param id
* @return
*/
ChangeRecord getById(Long id);
/**
* 根据状态及时间获取数据
*
* @param entityId
* @param sendEmail
* @param nodeId1
* @param nodeId2
* @param tomorrowSpecificTime
* @return
*/
List<ChangeRecord> getByStatusAndTime(Long entityId, Integer sendEmail, String nodeId1, String nodeId2, long tomorrowSpecificTime);
}
\ No newline at end of file
/**
* @(#)DESExport.java, 2022/12/8.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.dp.des.common.api.enums.DataType;
import com.netease.mail.dp.des.common.api.enums.TaskType;
import com.netease.mail.dp.des.common.api.query.CallbackQueryParam;
import com.netease.mail.dp.des.interaction.api.req.TaskReq;
import com.netease.mail.dp.des.starter.client.DesClient;
import com.netease.mail.yanxuan.change.biz.config.AppConfig;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowRequest;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Component
@Slf4j
public class DESExportService {
@Autowired
private DesClient desClient;
@Autowired
private AppConfig appConfig;
public String changeFlowExport(ChangeFlowRequest query) {
TaskReq taskReq = new TaskReq();
taskReq.setUserEmail(query.getUid());
taskReq.setProductCode(query.getServiceCode());
taskReq.setFileName("变更管理列表导出");
taskReq.setTaskType(TaskType.BIVARIATE);
taskReq.setDataType(DataType.CALLBACK);
CallbackQueryParam callbackQueryParam = new CallbackQueryParam();
callbackQueryParam.setParamJson(JSON.toJSONString(query));
callbackQueryParam.setCallbackBeanName("changeFlowExportCallback");
callbackQueryParam.setLimit(appConfig.getExportLimit());
taskReq.setCallbackQueryParam(callbackQueryParam);
String desResult = desClient.addTask(taskReq);
log.info("create task result: {}", desResult);
return desResult;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.biz.service;
import com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierGoodsInfoReq;
import com.netease.mail.yanxuan.change.integration.todo.SupplierItemPageVO;
public interface ISupplierItemService {
/**
* 查询供应商商品信息
*
* @param supplierGoodsInfoReq
* @param itemId
* @param itemName
* @param page
* @param pageSize
* @return
*/
SupplierItemPageVO supplierGoodsInfoBySupplier(SupplierGoodsInfoReq supplierGoodsInfoReq, String itemId, String itemName, Integer page, Integer pageSize);
}
package com.netease.mail.yanxuan.change.biz.service;
import java.util.List;
import java.util.Map;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeGoodsPrincipalPO;
import com.netease.mail.yanxuan.change.dal.meta.model.po.QueryCommanderEmailReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq;
import com.netease.mail.yanxuan.change.dal.meta.model.rpc.CommanderResponse;
import com.netease.mail.yanxuan.change.dal.meta.model.rpc.GoodsResponseRpc;
/**
* @author WangJiaXiang
* @date 2022/11/18/018$
* 内部服务接口
*/
public interface InteriorChangeConfigService {
/**
* 根据变更信息 返回住变更负责人
* @param changeCommander
* @return
*/
GoodsResponseRpc queryCommanderInfo(ChangeCommanderPO changeCommander);
/**
* 传入商品列表 返回商品信息
* @param itemIds
* @return
*/
Map<Long, ChangeGoodsPrincipalPO> queryGoodsPrincipalInfo(List<Long> itemIds);
/**
* 查询负责人信息
* @param req
* @return
*/
CommanderResponse queryCommanderEmail(QueryCommanderEmailReq req);
}
package com.netease.mail.yanxuan.change.biz.service.change;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigDeleteReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigReq;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
*/
public interface AdminChangeConfigService {
/**
* 查询更改配置类型列表
* @param changeConfigQueryReq 参数
* @return
*/
AjaxResult queryChanges(Integer pageNum,Integer pageSize,ChangeConfigQueryReq changeConfigQueryReq);
/**
* 查询更改配置详情
* @param id 模板id
* @return
*/
AjaxResult queryDetail(Long id,Long sonChangeClassId);
/**
* 新增更改类型配置模板
* @param changeConfigReq
* @param uid
* @param name
* @return
*/
AjaxResult createChange(ChangeConfigReq changeConfigReq, String uid, String name);
/**
* 修改更改类型配置模板
* @param changeConfigReq
* @return
*/
AjaxResult modifyChange(ChangeConfigReq changeConfigReq);
/**
* 删除更改类型配置模板
* @param id
* @return
*/
AjaxResult deleteChange(ChangeConfigDeleteReq id);
/**
* 返回所有配置类型
* @return
*/
AjaxResult queryConfigType();
}
package com.netease.mail.yanxuan.change.biz.service.change;
import com.netease.mail.yanxuan.change.dal.entity.ChangeConfig;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
* 基础服务用来方便内部调用
*/
public interface ChangeConfigService {
ChangeConfig queryChangeConfig(Long id);
ChangeConfig queryChangeConfig(Long id,Long sonChangeClassId);
ChangeConfigPo queryInfoPo(Long parentChangeClassId,Long sonChangeClassId);
ChangeConfig queryChangeType(Long parentChangeClassId,Long sonChangeClassId);
Boolean deleteChangeConfig(Long id);
ChangeConfig addChangeConfig(ChangeConfig changeConfig);
Boolean updateChangeConfig(ChangeConfig changeConfig);
ChangeConfig getSonChange(Long sonChangeId);
}
package com.netease.mail.yanxuan.change.biz.service.change;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecConfig;
import java.util.List;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
* 基础服务用来方便内部调用
*/
public interface ChangeExecConfigService {
List<ChangeExecConfig> queryChangeExecConfig(Long changeTemplateId);
List<ChangeExecConfig> addChangeExecConfig(Long id,List<ChangeExecConfig> changeExecConfigs);
List<ChangeExecConfig> updateChangeExecConfig(Long id,List<ChangeExecConfig> changeExecConfigs);
Boolean deleteChangeConfig(Long changeTemplateId);
}
package com.netease.mail.yanxuan.change.biz.service.change;
import com.netease.mail.yanxuan.change.dal.entity.ChangeType;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeTypePo;
import java.util.List;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
* 基础服务用来方便内部调用
*/
public interface ChangeTypeService {
/**
* 查询变更类型表
* @param id id
* @Param sonChangeClassId 二级ID
* @param deleteTab 是否查伪删除数据
* @return
*/
List<ChangeType> queryChangeType(Long id,Long sonChangeClassId,Boolean deleteTab);
/**
* 添加类型 如果遇到内容一样的情况下不能覆盖直接修改伪删状态 涉及到二级关联信息
* 关系是一对一绑定的所以List里面只会存储两条对象
* @param changeTypes
* @return
*/
List<ChangeType> addChangeType(List<ChangeType> changeTypes);
/**
* 因为牵扯到历史变更查询未保证变更类型的持久性不做真实删除和修改
* 伪善原来的 后新增
* @param changeTypes
* @return
*/
List<ChangeType> updateChangeType(List<ChangeType> changeTypes);
Boolean deleteChangeTypes(List<ChangeType> changeTypes);
/**
* 一级ID 二级ID 是否存在
*/
/**
* 二级目录类型查询出所有一级二级
* @return
*/
List<ChangeTypePo> queryConfigType();
/**
* 根据主键获取类型信息
* @param id
* @return
*/
ChangeType getChangeTypeById(Long id);
}
/**
* @(#)ChangeFileServiceImpl.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.netease.mail.yanxuan.change.common.enums.FileTypeEnum;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.netease.mail.yanxuan.change.biz.service.ChangeFileService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeFile;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeFileMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowFile;
/**
* @Author zcwang
* @Date 2022/11/21
*/
@Service
public class ChangeFileServiceImpl implements ChangeFileService {
@Autowired
private ChangeFileMapper changeFileMapper;
@Override
public List<ChangeFlowFile> getChangeFileList(Long changeRecordId) {
List<ChangeFile> changeFiles = changeFileMapper.selectByChangeRecordId(changeRecordId);
if (CollectionUtils.isNotEmpty(changeFiles)) {
return changeFiles.stream().map(c -> ChangeFlowFile.builder().fileType(c.getFileType()).fileName(c.getFileName())
.fileUrl(c.getFileUrl()).build()).collect(Collectors.toList());
}
return new ArrayList<>();
}
@Override
public void batchSaveRecord(List<ChangeFile> changeFiles) {
changeFileMapper.insertList(changeFiles);
}
@Override
public Integer deleteByChangeRecordId(Long changeRecordId) {
return changeFileMapper.deleteByBaseId(changeRecordId);
}
@Override
public void saveRecord(ChangeFile changeFile) {
changeFileMapper.insertSelective(changeFile);
}
@Override
public void deleteByChangeRecordIdAndType(Long changeRecordId, FileTypeEnum type) {
changeFileMapper.deleteByBaseIdAndType(changeRecordId, type.getType());
}
}
\ No newline at end of file
/**
* @(#)ChangeFlowExecServiceImpl.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowExecService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeExecRecordMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO;
/**
* @Author zcwang
* @Date 2022/11/21
*/
@Service
public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
@Autowired
private ChangeExecRecordMapper changeExecRecordMapper;
@Override
public List<ChangeFlowExecVO> getChangeFlowExecRecord(Long changeRecordId) {
List<ChangeExecRecord> changeExecRecords = changeExecRecordMapper.selectByChangeRecordId(changeRecordId);
if (CollectionUtils.isNotEmpty(changeExecRecords)) {
return changeExecRecords.stream()
.map(c -> ChangeFlowExecVO.builder().changeExecId(c.getId()).changeRecordId(c.getChangeRecordId())
.changeExecDepartment(c.getChangeExecDepartment()).changeExecUserType(c.getChangeExecUserType())
.changeExecUser(c.getChangeExecUser()).changeExecUserEmail(c.getChangeExecUserEmail())
.changeRiskDesc(c.getChangeRiskDesc()).changeExecProject(c.getChangeExecProject())
.changeChecking(c.getChangeChecking()).changeExecFinishTime(c.getChangeExecFinishTime())
.changeExecFinishDesc(c.getChangeExecFinishDesc()).build())
.collect(Collectors.toList());
}
return new ArrayList<>();
}
@Override
public void batchSaveRecord(List<ChangeExecRecord> changeExecRecordList) {
changeExecRecordMapper.insertList(changeExecRecordList);
}
@Override
public Boolean update(ChangeExecRecord changeExecRecord) {
return changeExecRecordMapper.updateByPrimaryKeySelective(changeExecRecord) > 0;
}
@Override
public Integer deleteByChangeRecordId(Long changeRecordId) {
return changeExecRecordMapper.deleteByBaseId(changeRecordId);
}
@Override
public void saveRecord(ChangeExecRecord exec) {
changeExecRecordMapper.insertSelective(exec);
}
}
\ No newline at end of file
/**
* @(#)ChangeFlowServiceImpl.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.netease.mail.yanxuan.change.biz.config.AppConfig;
import com.netease.mail.yanxuan.change.biz.config.TitleConfig;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper;
/**
* @Author zcwang
* @Date 2022/11/14
*/
@Service
public class ChangeFlowServiceImpl implements ChangeFlowService {
@Autowired
private ChangeRecordMapper changeRecordMapper;
@Autowired
private AppConfig appConfig;
@Override
public TitleConfig getTitleConfig() {
return appConfig.getTitleConfig();
}
@Override
public Boolean saveRecord(ChangeRecord changeRecord) {
return changeRecordMapper.insertSelective(changeRecord) > 0;
}
@Override
public ChangeRecord getByFlowId(Long flowId) {
return changeRecordMapper.selectByFlowId(flowId);
}
@Override
public Boolean updateRecord(ChangeRecord changeRecord) {
return changeRecordMapper.updateByPrimaryKeySelective(changeRecord) > 0;
}
@Override
public ChangeRecord getById(Long id) {
return changeRecordMapper.selectByPrimaryKey(id);
}
@Override
public List<ChangeRecord> getByStatusAndTime(Long entityId, Integer sendEmail, String nodeId1, String nodeId2, long tomorrowSpecificTime) {
return changeRecordMapper.getByStatusAndTime(entityId, sendEmail, nodeId1, nodeId2, tomorrowSpecificTime);
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.biz.service.impl;
import com.netease.mail.yanxuan.change.biz.service.ISupplierItemService;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierSendService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierGoodsInfoReq;
import com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierGoodsInfoRsp;
import com.netease.mail.yanxuan.change.integration.item.ItemRpcService;
import com.netease.mail.yanxuan.change.integration.item.meta.SpuTO;
import com.netease.mail.yanxuan.change.integration.item.param.BatchQuerySpuInfoParam;
import com.netease.mail.yanxuan.change.integration.todo.PageVO;
import com.netease.mail.yanxuan.change.integration.todo.SupplierItemPageVO;
import com.netease.mail.yanxuan.change.integration.todo.SupplierItemVO;
import com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class SupplierItemServiceImpl implements ISupplierItemService {
@Autowired
private FlowRpcSupplierSendService flowRpcSupplierSendService;
@Autowired
private ItemRpcService itemRpcService;
@Override
public SupplierItemPageVO supplierGoodsInfoBySupplier(SupplierGoodsInfoReq supplierGoodsInfoReq, String itemId, String itemName, Integer page, Integer pageSize) {
AjaxResponse<List<SupplierGoodsInfoRsp>> listAjaxResponse = flowRpcSupplierSendService.supplierGoodsInfoBySupplier(supplierGoodsInfoReq);
List<SupplierGoodsInfoRsp> data = listAjaxResponse.getData();
List<SpuTO> spuTOList = new ArrayList<>();
if (data != null) {
Set<Long> fullItemIds = data.stream().map(SupplierGoodsInfoRsp::getItemId).collect(Collectors.toSet());
while (fullItemIds.size() > 200) {
List<Long> itemIds = new ArrayList<>(fullItemIds).subList(0, 200);
AjaxResult<List<SpuTO>> listAjaxResult = itemRpcService.batchQuerySpuInfo(BatchQuerySpuInfoParam.builder().ids(itemIds).build());
List<SpuTO> pageSpuTo = listAjaxResult.getData();
if (!CollectionUtils.isEmpty(pageSpuTo)) {
spuTOList.addAll(pageSpuTo);
}
fullItemIds.removeAll(itemIds);
}
}
if (StringUtils.isNotBlank(itemId)) {
spuTOList = spuTOList.stream().filter(i -> Long.valueOf(itemId).equals(i.getId())).collect(Collectors.toList());
}
if (StringUtils.isNotBlank(itemName)) {
spuTOList = spuTOList.stream().filter(i -> i.getName().contains(itemName)).collect(Collectors.toList());
}
PageVO pageVO = buildPageVo(spuTOList.size(), page, pageSize);
Integer endIndex = page * pageSize;
if (page * pageSize > spuTOList.size()) {
endIndex = spuTOList.size();
}
List<SpuTO> pageItem = spuTOList.subList((page - 1) * pageSize, endIndex);
List<SupplierItemVO> supplierItemVOList = pageItem.stream().map(i -> {
SupplierItemVO supplierItemVO = new SupplierItemVO();
supplierItemVO.setItemId(i.getId());
supplierItemVO.setItemName(i.getName());
return supplierItemVO;
}).collect(Collectors.toList());
return SupplierItemPageVO.builder().pageVo(pageVO).supplierItemVOList(supplierItemVOList).build();
}
private PageVO buildPageVo(int size, Integer page, Integer pageSize) {
int totalPage = size % pageSize == 0 ? size / pageSize : size / pageSize + 1;
return PageVO.builder().page(page).pageSize(pageSize).totalCount(size).totalPage(totalPage).build();
}
}
package com.netease.mail.yanxuan.change.biz.service.impl.change;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeConfig;
import com.netease.mail.yanxuan.change.dal.entity.ChangeType;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeConfigMapper;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeTypeMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
*/
@Service
public class ChangeConfigServiceImpl implements ChangeConfigService {
@Autowired
public ChangeConfigMapper mapper;
@Autowired
private ChangeTypeMapper changeTypeMapper;
@Override
public ChangeConfig queryChangeConfig(Long id) {
return mapper.queryById(id);
}
@Override
public ChangeConfig queryChangeConfig(Long id, Long sonChangeClassId) {
return mapper.queryInfo(id, sonChangeClassId);
}
@Override
public ChangeConfigPo queryInfoPo(Long parentChangeClassId,Long sonChangeClassId) {
ChangeConfigPo changeConfigPo = mapper.queryInfoPo(parentChangeClassId, sonChangeClassId);
ChangeType parentChangeType = changeTypeMapper.selectByPrimaryKey(changeConfigPo.getParentChangeClassId());
ChangeType sonChangeType = changeTypeMapper.selectByPrimaryKey(changeConfigPo.getSonChangeClassId());
List<ChangeType> changeTypes = new ArrayList<>();
changeTypes.add(parentChangeType);
changeTypes.add(sonChangeType);
changeConfigPo.setChangeTypes(changeTypes);
return changeConfigPo;
}
@Override
public ChangeConfig queryChangeType(Long parentChangeClassId, Long sonChangeClassId) {
if (parentChangeClassId == null || sonChangeClassId == null){
return null;
}
return mapper.queryChangeType(parentChangeClassId, sonChangeClassId);
}
@Override
public Boolean deleteChangeConfig(Long id) {
mapper.deleteById(id);
return true;
}
@Override
public ChangeConfig addChangeConfig(ChangeConfig changeConfig) {
mapper.insertSelective(changeConfig);
return changeConfig;
}
@Override
public Boolean updateChangeConfig(ChangeConfig changeConfig) {
changeConfig.setUpdateTime(System.currentTimeMillis());
mapper.updateByPrimaryKeySelective(changeConfig);
return true;
}
@Override
public ChangeConfig getSonChange(Long sonChangeId) {
return mapper.selectBySonConfig(sonChangeId);
}
}
package com.netease.mail.yanxuan.change.biz.service.impl.change;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeExecConfigService;
import com.netease.mail.yanxuan.change.common.bean.RequestLocalBean;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecConfig;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeExecConfigMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
*/
@Service
public class ChangeExecConfigServiceImpl implements ChangeExecConfigService {
@Autowired
private ChangeExecConfigMapper mapper;
@Override
public List<ChangeExecConfig> queryChangeExecConfig(Long changeTemplateId) {
return mapper.queryChangeExecConfig(changeTemplateId);
}
@Override
public List<ChangeExecConfig> addChangeExecConfig(Long id,List<ChangeExecConfig> changeExecConfigs) {
long currentTime = System.currentTimeMillis();
//循环添加
for (ChangeExecConfig changeExecConfig : changeExecConfigs){
//如果变更行动方案是变更发起人的话就填充登入人信息
if(changeExecConfig.getChangeExecUserType() == 1){
changeExecConfig.setChangeExecUser(RequestLocalBean.getUid());
}
//在修改的时候实际上删除在新增需要屏蔽掉ID
if (changeExecConfig.getId() != null){
changeExecConfig.setId(null);
}
changeExecConfig.setChangeTemplateId(id);
changeExecConfig.setCreateTime(currentTime);
changeExecConfig.setUpdateTime(currentTime);
//行动项,变更风险描述, 变更验证措施, 需要判断字段长度 参数验证 暂不验证
mapper.insertSelective(changeExecConfig);
}
return changeExecConfigs;
}
@Override
public List<ChangeExecConfig> updateChangeExecConfig(Long id,List<ChangeExecConfig> changeExecConfigs) {
//删除原来的行动
deleteChangeConfig(id);
return addChangeExecConfig(id,changeExecConfigs);
}
@Override
public Boolean deleteChangeConfig(Long changeTemplateId) {
mapper.deleteChangeConfig(changeTemplateId);
return true;
}
}
package com.netease.mail.yanxuan.change.biz.service.impl.change;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeType;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeTypeMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeTypePo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.*;
/**
* @author WangJiaXiang
* @date 2022/11/11/011$
*/
@Service
public class ChangeTypeServiceImpl implements ChangeTypeService {
@Autowired
private ChangeTypeMapper mapper;
@Override
public List<ChangeType> queryChangeType(Long id,Long sonChangeClassId, Boolean deleteTab) {
Integer delete = deleteTab?0:1;
return mapper.queryTypes(id,sonChangeClassId,delete);
}
Logger logger = LoggerFactory.getLogger(ChangeTypeServiceImpl.class);
@Override
@Transactional
public List<ChangeType> addChangeType(List<ChangeType> changeTypes) {
if (changeTypes.size() != 2){
throw ExceptionFactory.createBiz(ResponseCode.PARAMETER_LENGTH);
}
logger.info("查看一级二级入参数量"+changeTypes.size() + "值\n" +changeTypes);
//验证字符串长度
if (changeTypes.get(0).getTypeName().length() > 20 && changeTypes.get(1).getTypeName().length() > 20){
throw ExceptionFactory.createBiz(ResponseCode.PARAMETER_LENGTH);
}
ChangeType changeType = queryRepetitionChangeType(changeTypes);
if (changeType == null) {
//初始化参数载入
changeTypes.get(0).setCreateTime(System.currentTimeMillis());
changeTypes.get(0).setUpdateTime(System.currentTimeMillis());
changeTypes.get(0).setParentId(0L);
mapper.insertSelective(changeTypes.get(0));
}else{
changeTypes.set(0,changeType);
changeTypes.get(1).setParentId(changeType.getId());
}
//初始化参数载入
changeTypes.get(1).setParentId(changeTypes.get(0).getId());
changeTypes.get(1).setCreateTime(System.currentTimeMillis());
changeTypes.get(1).setUpdateTime(System.currentTimeMillis());
mapper.insertSelective(changeTypes.get(1));
return changeTypes;
}
@Override
public List<ChangeType> updateChangeType(List<ChangeType> changeTypes) {
//根据传进来的一级ID 和二级ID 进行查询
List<ChangeType> changeTypeList = mapper.queryTypes(changeTypes.get(0).getId(), changeTypes.get(1).getId(), 0);
//如果一级无变化
if (changeTypeList.get(0).getTypeName().equals(changeTypes.get(0).getTypeName())) {
if (changeTypeList.get(1).getTypeName().equals(changeTypes.get(1).getTypeName())){
//未改变情况直接返回
return changeTypes;
}else{
//一级未改变 二级发生改变
List<ChangeType> sonChanges = mapper.queryParent(changeTypes.get(0).getId());
Optional<ChangeType> sonTypeHave = sonChanges.stream()
.filter(i -> i.getTypeName().equals(changeTypes.get(1).getTypeName())).findAny();
if (sonTypeHave.isPresent()) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "二级分类存在");
}
//删除老的二级,增加新的二级
deleteChangeType(changeTypeList.get(1));
//发现没有直接新增并返回
changeTypes.get(1).setId(null);
changeTypes.get(1).setParentId(changeTypes.get(0).getId());
changeTypes.get(1).setCreateTime(System.currentTimeMillis());
changeTypes.get(1).setUpdateTime(System.currentTimeMillis());
mapper.insertSelective(changeTypes.get(1));
return changeTypes;
}
}else{
//查询 所有一级ID 是否有重复的
ChangeType changeParentType = mapper.queryTypeName(changeTypes.get(0).getTypeName());
if (changeParentType == null) {
deleteChangeType(changeTypeList.get(1));
//ID置空
changeTypes.get(0).setId(null);
changeTypes.get(1).setId(null);
//新增一级二级并返回
return addChangeType(changeTypes);
}
//查询二级
List<ChangeType> sonChanges = mapper.queryParent(changeParentType.getId());
Optional<ChangeType> sonTypeHave = sonChanges.stream()
.filter(i -> i.getTypeName().equals(changeTypes.get(1).getTypeName())).findAny();
if (sonTypeHave.isPresent()) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "二级分类存在");
}
//删除老的二级,增加新的二级
deleteChangeType(changeTypeList.get(1));
//发现没有直接新增并返回
changeTypes.get(1).setId(null);
changeTypes.set(0,changeParentType);
changeTypes.get(1).setParentId(changeParentType.getId());
changeTypes.get(1).setCreateTime(System.currentTimeMillis());
changeTypes.get(1).setUpdateTime(System.currentTimeMillis());
mapper.insertSelective(changeTypes.get(1));
return changeTypes;
}
}
@Override
@Transactional
public Boolean deleteChangeTypes(List<ChangeType> changeTypes) {
if (changeTypes.get(0) == null || changeTypes.get(1) == null){
throw ExceptionFactory.createParamFail();
}
//查询一级下班是否还存在其他二级 如果不存在就删除一级 如果存在一级就不做伪删
List<ChangeType> changeTypeList = mapper.queryParent(changeTypes.get(0).getId());
if (changeTypeList.size() != 2){
changeTypes.remove(0);
}
for (ChangeType changeType : changeTypes){
Example example = new Example(ChangeType.class);
Example.Criteria criteria = example.createCriteria();
criteria.orEqualTo("id",changeType.getId());
changeType.setDeleteType(1);
changeType.setUpdateTime(System.currentTimeMillis());
mapper.updateByExampleSelective(changeType,example);
}
return true;
}
public void deleteChangeType(ChangeType changeType) {
if (changeType == null ){
throw ExceptionFactory.createParamFail();
}
Example example = new Example(ChangeType.class);
Example.Criteria criteria = example.createCriteria();
criteria.orEqualTo("id",changeType.getId());
changeType.setDeleteType(1);
changeType.setUpdateTime(System.currentTimeMillis());
mapper.updateByExampleSelective(changeType,example);
}
@Override
public List<ChangeTypePo> queryConfigType() {
//获取数据,创建目录集合,遍历分组
List<ChangeTypePo> changeTypes = mapper.queryArrayChangeTypes();
List<ChangeTypePo> pos = new ArrayList<>();
for (ChangeTypePo changeType : changeTypes) {
if (changeType.getParentId() == 0){
//如果是一级 插入MAP 并创建List列表
changeType.setChangeTypes(new ArrayList<>());
pos.add(changeType);
}else{
for (ChangeTypePo po : pos){
if (po.getId().equals( changeType.getParentId())){
po.getChangeTypes().add(changeType);
}
}
}
}
//去重如果父类下边包裹的List数量为0的时候就自动剔除
pos.removeIf(changeTypePo -> changeTypePo.getChangeTypes().size() == 0);
return pos;
}
@Override
public ChangeType getChangeTypeById(Long id) {
return mapper.selectByPrimaryKey(id);
}
/**
* 判断变更类型是否重复(只判断未伪善出的)
* @param changeTypes
* @return
*/
private ChangeType queryRepetitionChangeType(List<ChangeType> changeTypes) {
if (changeTypes.get(0) == null || changeTypes.get(1) == null){
throw ExceptionFactory.createParamFail();
}
//获取父类是否存在
ChangeType changeParentType = mapper.queryTypeName(changeTypes.get(0).getTypeName());
if (changeParentType == null){
return null;
}
//如果存在查询父类下面所有子类 查询是否有重复的
List<ChangeType> sonChangeTypes = mapper.queryParent(changeParentType.getId());
for (ChangeType changeType : sonChangeTypes){
if (changeType.getTypeName().equals(changeTypes.get(1).getTypeName())){
throw ExceptionFactory.createBiz(ResponseCode.CHANGE_TYPE_NAME_TOW);
}
}
return changeParentType;
}
}
/**
* @(#)FlowService.java, 2022/11/29.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.List;
import com.netease.mail.yanxuan.change.common.bean.RequestLocalBean;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeFlowEnum;
import com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum;
import com.netease.mail.yanxuan.change.integration.flow.FlowRpcService;
import com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse;
import com.netease.yanxuan.flowx.sdk.meta.dto.base.FlowDataDTO;
import com.netease.yanxuan.flowx.sdk.meta.dto.base.UserBaseDTO;
import com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO;
import com.netease.yanxuan.flowx.sdk.meta.dto.flow.NodeSubmitReqDTO;
import com.netease.yanxuan.flowx.sdk.meta.dto.flow.UpdateNodeApproverDTO;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/11/29
* 工单流转相关操作
*/
@Slf4j
@Component
public class FlowService {
@Autowired
private FlowRpcService flowRpcService;
/**
* 创建工单
* @param flowCreateReqDTO
* @return
*/
public String createFlow(FlowCreateReqDTO flowCreateReqDTO) {
// 先创建工单,创建完成后直接提交
log.info("[createFlow] flowCreateReqDTO={}", flowCreateReqDTO);
AjaxResponse<String> flowCreateResponse = flowRpcService.create(CommonConstants.FLOWX_PRODUCT,
flowCreateReqDTO);
String flowId;
if (ResponseCodeEnum.SUCCESS.getCode() == flowCreateResponse.getCode()) {
flowId = flowCreateResponse.getData();
log.info("[createFlow] flowId ={}", JSON.toJSONString(flowId));
} else {
log.error("[createFlow] create flow failed, query={}, errMsg={}", JSON.toJSONString(flowCreateReqDTO),
JSON.toJSONString(flowCreateResponse));
throw ExceptionFactory.createBiz(ResponseCode.CREATE_FLOW_ERROR, "创建工单错误");
}
return flowId;
}
/**
* 提交工单
* @param flowId
* @param flowDataDTO
* @param uid
* @param topoId
* @param content
* @param approved
* @param createTime
* @return
*/
public String submitFlow(String flowId, FlowDataDTO flowDataDTO, String uid, String topoId, String content,
boolean approved, String operateResult, String remark, Long createTime) {
String name = RequestLocalBean.getName();
NodeSubmitReqDTO nodeSubmitReqDTO = new NodeSubmitReqDTO();
nodeSubmitReqDTO.setFlowId(flowId);
nodeSubmitReqDTO.setNodeId(flowDataDTO.getFlowMeta().getCurrNodeDataList().get(0).getNodeId());
nodeSubmitReqDTO.setUid(uid);
nodeSubmitReqDTO.setUserName(name);
nodeSubmitReqDTO.setTopoId(topoId);
nodeSubmitReqDTO.setContent(content);
nodeSubmitReqDTO.setOperateResult(operateResult);
nodeSubmitReqDTO.setRemark(remark);
nodeSubmitReqDTO.setCreateTime(createTime);
nodeSubmitReqDTO.setApproved(approved);
nodeSubmitReqDTO.setOccLock(flowDataDTO.getOccLock() + 1);
log.info("[submitFlow] nodeSubmitReqDTO={}", JSON.toJSONString(nodeSubmitReqDTO));
List<String> nextNodeIdList;
// 提交工单
AjaxResponse<List<String>> submitResponse = flowRpcService.submit(CommonConstants.FLOWX_PRODUCT,
nodeSubmitReqDTO);
if (ResponseCodeEnum.SUCCESS.getCode() == submitResponse.getCode()) {
nextNodeIdList = submitResponse.getData();
log.info("[submitFlow] nextNodeIdList={}", JSON.toJSONString(nextNodeIdList));
} else {
log.error("[submitFlow] submit flow failed, query={}, errMsg={}", JSON.toJSONString(nodeSubmitReqDTO),
JSON.toJSONString(submitResponse));
throw ExceptionFactory.createBiz(ResponseCode.SUBMIT_FLOW_ERROR, "提交工单错误");
}
if (CollectionUtils.isEmpty(nextNodeIdList)) {
return ChangeFlowEnum.END.getNodeId();
}
return nextNodeIdList.get(0);
}
/**
* 查询工单详情
* @param flowId
* @return
*/
public FlowDataDTO flowDetail(String flowId) {
// 查询工单详情,根据详情提交
FlowDataDTO flowDataDTO;
AjaxResponse<FlowDataDTO> flowDetailResponse = flowRpcService.getDetail(CommonConstants.FLOWX_PRODUCT, flowId);
if (ResponseCodeEnum.SUCCESS.getCode() == flowDetailResponse.getCode()) {
flowDataDTO = flowDetailResponse.getData();
log.info("[detailFlow] flowDataDTO={}", JSON.toJSONString(flowDataDTO));
} else {
log.error("[detailFlow] get flow detail failed, query={}, errMsg={}", JSON.toJSONString(flowId),
JSON.toJSONString(flowDetailResponse));
throw ExceptionFactory.createBiz(ResponseCode.DETAIL_FLOW_ERROR, "查询工单详情错误");
}
return flowDataDTO;
}
/**
* 更新待办人
* @param topoId
* @param flowId
* @param currentNodeId
* @param newApproverList
* @param uid
* @param userName
* @param remark
* @param content
*/
public void updateApprovers(String topoId, String flowId, String currentNodeId, List<UserBaseDTO> newApproverList,
String uid, String userName, String remark, String content){
FlowDataDTO flowDataDTO = this.flowDetail(flowId);
UpdateNodeApproverDTO approverDTO = new UpdateNodeApproverDTO();
approverDTO.setOccLock(flowDataDTO.getOccLock() + 1);
approverDTO.setTopoId(topoId);
approverDTO.setNodeId(currentNodeId);
approverDTO.setFlowId(flowId);
approverDTO.setNewApproverList(newApproverList);
approverDTO.setUid(uid);
approverDTO.setUserName(userName);
approverDTO.setRemark(remark);
approverDTO.setContent(content);
approverDTO.setOperateResult(FlowxOperationEnum.DELIVER.getName());
flowRpcService.updateApprovers(CommonConstants.FLOWX_PRODUCT, approverDTO);
}
}
\ No newline at end of file
/**
* @(#)itemRpcService.java, 2022/11/30.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.integration.item.ItemRpcService;
import com.netease.mail.yanxuan.change.integration.item.SimplePhyCateGoryResultCo;
import com.netease.mail.yanxuan.change.integration.item.meta.SpuTO;
import com.netease.mail.yanxuan.change.integration.item.param.BatchQuerySpuInfoParam;
import com.netease.mail.yanxuan.change.integration.item.param.CommonIdsParamQuery;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/11/30
*/
@Slf4j
@Component
public class ItemService {
@Autowired
private ItemRpcService itemRpcService;
/**
* 查询物理类目
*
* @param query
* @return
* key: 商品id,value:商品的物理类目
*/
public Map<Long, List<SimplePhyCateGoryResultCo>> queryBySpuIds(CommonIdsParamQuery query) {
log.info("[ItemRpcService-queryCategoryChain] request of query={}",
JSON.toJSONString(query));
AjaxResult<Map<Long, List<SimplePhyCateGoryResultCo>>> response = itemRpcService
.queryBySpuIds(query);
log.info("[ItemRpcService-queryCategoryChain] response of query queryCategoryChain ={}",
JSON.toJSONString(response));
if (Boolean.TRUE.equals(response.isSuccess())) {
return response.getData();
}
log.error("[op:rpc-queryCategoryChain] query categoryChain detail failed, query={}, errMsg={}", query,
response.getMsg());
return new HashMap<>();
}
public List<SpuTO> batchQuerySpuInfo(BatchQuerySpuInfoParam query) {
log.info("[ItemRpcService-batchQuerySpuInfo] request of query={}",
JSON.toJSONString(query));
AjaxResult<List<SpuTO>> response = itemRpcService.batchQuerySpuInfo(query);
log.info("[ItemRpcService-batchQuerySpuInfo] response of query batchQuerySpuInfo ={}",
JSON.toJSONString(response));
if (Boolean.TRUE.equals(response.isSuccess())) {
return response.getData();
}
log.error("[op:rpc-batchQuerySpuInfo] query batchQuerySpuInfo failed, query={}, errMsg={}", query,
response.getMsg());
return new ArrayList<>();
}
}
/**
* @(#)IusService.java, 2022/12/7.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum;
import com.netease.mail.yanxuan.change.integration.flow.UserQueryDTO;
import com.netease.mail.yanxuan.change.integration.flow.ius.IusRpcService;
import com.netease.mail.yanxuan.change.integration.flow.ius.req.IusDepartmentReq;
import com.netease.mail.yanxuan.change.integration.flow.ius.rsp.IusUserInfoRsp;
import com.netease.mail.yanxuan.change.integration.flow.ius.rsp.SecondaryDepartments;
import com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/12/7
*/
@Slf4j
@Component
public class IusService {
@Autowired
private IusRpcService iusRpcService;
public HashMap<String, List<SecondaryDepartments>> queryDepartment(IusDepartmentReq iusDepartmentReq) {
log.info("[queryDepartment] queryDepartment req:{}", JSON.toJSONString(iusDepartmentReq));
AjaxResponse<HashMap<String, List<SecondaryDepartments>>> response = iusRpcService.queryDepartment(iusDepartmentReq);
log.info("[queryDepartment] response of queryDepartment ={}",
JSON.toJSONString(response));
if (ResponseCodeEnum.SUCCESS.getCode() == response.getCode()) {
return response.getData();
} else {
log.error("[queryDepartment] queryDepartment failed, query={}, errMsg={}", JSON.toJSONString(iusDepartmentReq),
JSON.toJSONString(response));
throw ExceptionFactory.createBiz(ResponseCode.CREATE_FLOW_ERROR, "查询部门错误");
}
}
/**
* 查询用户信息
*/
public List<IusUserInfoRsp> queryUserListInfo(UserQueryDTO query) {
log.info("[queryUserListInfo] queryUserListInfo req:{}", JSON.toJSONString(query));
AjaxResponse<List<IusUserInfoRsp>> response = iusRpcService.queryUserListInfo(query);
log.info("[queryUserListInfo] response of queryUserListInfo ={}", JSON.toJSONString(response));
if (ResponseCodeEnum.SUCCESS.getCode() == response.getCode()) {
return response.getData();
} else {
log.error("[queryUserListInfo] queryUserListInfo failed, query={}, errMsg={}", JSON.toJSONString(query),
JSON.toJSONString(response));
return new ArrayList<>();
}
}
}
\ No newline at end of file
/**
* @(#)QCService.java, 2022/12/2.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
import com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum;
import com.netease.mail.yanxuan.change.integration.qc.QcRpcService;
import com.netease.mail.yanxuan.change.integration.qc.meta.QcCategoryVO;
import com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/12/2
*/
@Slf4j
@Component
public class QCService {
@Autowired
private QcRpcService qcRpcService;
@Autowired
private StringRedisTemplate redisTemplate;
public List<QcCategoryVO> getQcCategoryListByItemId(Long itemId) {
log.info("[QCService-getQcCategoryListByItemId] request of query={}", itemId);
String key = String.format(CommonConstants.ITEM_QC_CATEGORY_CACHE, itemId);
String result = redisTemplate.opsForValue().get(key);
if (StringUtils.isNotBlank(result)) {
log.info("[QCService-getQcCategoryListByItemId] response from redis, query QcCategoryList ={}", result);
return JSON.parseArray(result, QcCategoryVO.class);
}
AjaxResponse<List<QcCategoryVO>> response = qcRpcService.getQcCategoryListByItemId(itemId);
log.info("[QCService-getQcCategoryListByItemId] response of query QcCategoryList ={}",
JSON.toJSONString(response));
if (ResponseCodeEnum.SUCCESS.getCode() == response.getCode()) {
redisTemplate.opsForValue().set(key, JSON.toJSONString(response.getData()),7, TimeUnit.DAYS);
return response.getData();
}
log.error("[op:rpc-getQcCategoryListByItemId] query QcCategoryList failed, query={}, errMsg={}", itemId,
response.getErrorMsg());
return Collections.emptyList();
}
}
\ No newline at end of file
/**
* @(#)SupplierSendService.java, 2022/12/8.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.Map;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.integration.email.email.EmailFactor;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTypeEnum;
import com.netease.mail.yanxuan.change.integration.email.service.impl.EmailTemplateServiceImpl;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierSendService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierSendEmailReq;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Slf4j
@Component
public class SupplierSendService {
@Autowired
private FlowRpcSupplierSendService flowRpcSupplierSendService;
@Autowired
private EmailTemplateServiceImpl emailTemplateService;
public void sendSupplierEmail(String supplier, String subjectParam, EmailTemplateEnum emailTemplateEnum,
Map<String, Object> param) {
try {
SupplierSendEmailReq req = new SupplierSendEmailReq();
req.setSupplierId(supplier);
String subject = emailTemplateEnum.getSubject();
//标题参数处理
if (Strings.isNotBlank(subjectParam)) {
subject = String.format(subject, subjectParam);
}
req.setMailSubject(subject);
EmailFactor factor = EmailFactor.builder().data(param).emailTemplateEnum(emailTemplateEnum).subject(subject)
.type(EmailTypeEnum.HTML.getType()).build();
String content = this.content(factor);
req.setMailContent(content);
log.debug("[sendSupplierEmail] supplier:{}, subjectParam:{}, subject:{}, content:{}", supplier,
subjectParam, subject, JSON.toJSONString(content));
String result = flowRpcSupplierSendService.sendEmail(req);
log.info("[sendSupplierEmail] result:{}", result);
} catch (Exception e) {
log.error("[op:sendSupplierEmail] error,supplier:{},subjectParam:{}, e:{}", supplier, subjectParam, e);
}
}
/**
* 根据邮件模版获取邮件内容
*
* @param emailFactor
* @return
*/
private String content(EmailFactor emailFactor) {
EmailTemplateEnum emailTemplateEnum = emailFactor.getEmailTemplateEnum();
return emailTemplateService.template(emailTemplateEnum.getCode(), emailFactor.getData(),
emailFactor.getType());
}
}
\ No newline at end of file
/**
* @(#)SupplierService.java, 2022/12/15.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.service.rpc;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierSendService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierSearchRemoteReq;
import com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierSimpleRsp;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/12/15
*/
@Component
@Slf4j
public class SupplierService {
@Autowired
private FlowRpcSupplierSendService supplierSendService;
public List<SupplierSimpleRsp> getSupplierName(String supplierUid) {
log.info("[getSupplierName] request of query={}", supplierUid);
AjaxResult<List<SupplierSimpleRsp>> response = supplierSendService.queryByConditionForQc(
SupplierSearchRemoteReq.builder().limitSupplierIdList(Collections.singletonList(supplierUid)).build());
log.info("[getSupplierName] response of query={}", JSON.toJSONString(response));
if (Boolean.TRUE.equals(response.isSuccess())) {
return response.getData();
}
log.error("[op:getSupplierName] getSupplierName failed, query={}, errMsg={}", supplierUid,
response.getMsg());
return Collections.emptyList();
}
}
\ No newline at end of file
// /**
// * @(#)TodoService.java, 2022/11/29.
// * <p/>
// * Copyright 2022 Netease, Inc. All rights reserved.
// * NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
// */
// package com.netease.mail.yanxuan.change.biz.service.rpc;
//
// import java.util.HashMap;
// import java.util.Map;
//
// import org.apache.commons.lang3.StringUtils;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.stereotype.Component;
//
// import com.alibaba.fastjson.JSON;
// import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
// import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
// import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
// import com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum;
// import com.netease.mail.yanxuan.change.common.enums.OperateTypeEnum;
// import com.netease.mail.yanxuan.change.common.enums.TodoTaskTypeEnum;
// import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
// import com.netease.mail.yanxuan.change.integration.todo.TaskCreateDTO;
// import com.netease.mail.yanxuan.change.integration.todo.TaskCreateParamVO;
// import com.netease.mail.yanxuan.change.integration.todo.TaskProcessParamVO;
// import com.netease.mail.yanxuan.change.integration.todo.TodoRpcService;
// import com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse;
//
// import lombok.extern.slf4j.Slf4j;
//
// /**
// * @Author zcwang
// * @Date 2022/11/29
// * 待办相关操作
// */
// @Component
// @Slf4j
// public class TodoService {
//
// @Autowired
// private TodoRpcService todoRpcService;
//
// /**
// * 创建代办
// * @param entity
// */
// public TaskCreateDTO createTodoTask(ChangeRecord entity) {
// String changeCommander = entity.getChangeCommander();
// TaskCreateDTO taskCreateDTO = new TaskCreateDTO();
// if (StringUtils.isNotEmpty(changeCommander)) {
// String flowId = String.valueOf(entity.getFlowId());
// Map<String, Object> businessContent = new HashMap<>();
// businessContent.put("nodeTitle", entity.getChangeContent());
// businessContent.put("taskFlowId", flowId);
// businessContent.put("newFlow", flowId);
// TaskCreateParamVO taskCreateParamVO = new TaskCreateParamVO();
// taskCreateParamVO.setBusinessKey(flowId);
// taskCreateParamVO.setContent(JSON.toJSONString(businessContent));
// taskCreateParamVO.setProduct(CommonConstants.FLOWX_PRODUCT);
// taskCreateParamVO.setTaskCreator(changeCommander);
// taskCreateParamVO.setTaskHandler(changeCommander);
// taskCreateParamVO.setTaskHandlerName(changeCommander);
// taskCreateParamVO.setTaskTitle("测试");
// taskCreateParamVO.setTaskTypeKey(TodoTaskTypeEnum.QC_CHANGE.getValue());
// AjaxResponse<TaskCreateDTO> taskCreateResponse = todoRpcService.create(taskCreateParamVO);
// if (ResponseCodeEnum.SUCCESS.getCode() == taskCreateResponse.getCode()) {
// taskCreateDTO = taskCreateResponse.getData();
// log.info("[createTodoTask] taskCreateDTO={}", JSON.toJSONString(taskCreateDTO));
//
// } else {
// log.error("[createTodoTask] create todo failed, param={}, errMsg={}", JSON.toJSONString(taskCreateParamVO),
// JSON.toJSONString(taskCreateResponse));
// throw ExceptionFactory.createBiz(ResponseCode.CREATE_TODO_ERROR, "查询工单详情错误");
// }
//
// }
// return taskCreateDTO;
// }
//
// /**
// * 处理待办
// * @param entity
// * @param operateType
// * @see OperateTypeEnum
// */
// public void progressTodoTask(ChangeRecord entity, Integer operateType) {
// String changeCommander = entity.getChangeCommander();
// String flowId = String.valueOf(entity.getFlowId());
// log.info("[finishSupplierTodoTask] taskFlowId={}, supplierId={}", flowId, changeCommander);
// if (StringUtils.isNotEmpty(changeCommander)) {
// TaskProcessParamVO taskProcessParamVO = new TaskProcessParamVO();
// taskProcessParamVO.setBusinessKey(flowId);
// taskProcessParamVO.setOperateType(OperateTypeEnum.FINISH.getType());
// taskProcessParamVO.setOperator(changeCommander);
// taskProcessParamVO.setOperatorName(changeCommander);
// taskProcessParamVO.setProduct(CommonConstants.FLOWX_PRODUCT);
// taskProcessParamVO.setTaskId(entity.getTodoId());
// todoRpcService.progress(taskProcessParamVO);
// }
// }
// }
\ No newline at end of file
/**
* @(#)AutoSubmit.java, 2022/11/24.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.biz.task;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz;
import com.netease.mail.yanxuan.change.biz.config.AppConfig;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowExecService;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService;
import com.netease.mail.yanxuan.change.biz.service.rpc.FlowService;
import com.netease.mail.yanxuan.change.biz.service.rpc.SupplierSendService;
import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
import com.netease.mail.yanxuan.change.common.enums.ChangeFlowEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum;
import com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum;
import com.netease.mail.yanxuan.change.common.enums.FlowOperationTypeEnum;
import com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum;
import com.netease.mail.yanxuan.change.common.util.DateUtils;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum;
import com.netease.mail.yanxuan.dschedule.core.biz.model.ReturnT;
import com.netease.mail.yanxuan.dschedule.core.handler.IJobHandler;
import com.netease.mail.yanxuan.dschedule.core.handler.annotation.JobHandler;
import com.netease.yanxuan.flowx.sdk.meta.dto.base.FlowDataDTO;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/11/24
*/
@Component
@Slf4j
@JobHandler("AutoSubmit")
public class AutoSubmit extends IJobHandler {
@Autowired
private ChangeFlowService changeFlowService;
@Autowired
private FlowService flowService;
@Autowired
private ChangeFlowBiz changeFlowBiz;
@Autowired
private SupplierSendService sendSupplierEmail;
@Autowired
private ChangeConfigService changeConfigService;
@Autowired
private ChangeFlowExecService changeFlowExecService;
@Autowired
private AppConfig appConfig;
@Override
public ReturnT<String> execute(String... strings) throws Exception {
log.info("AutoSubmit start");
long startTime = DateUtils.getCurrentTime();
// 处理变更确认时间是今天24点之前的
Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("00:00:00");
List<Long> count = new ArrayList<>();
Long entityId = 0L;
// 查询今天时间之前的未发送邮件的数据
try {
while (true) {
List<ChangeRecord> records = changeFlowService.getByStatusAndTime(entityId, 0,
ChangeFlowEnum.CHANGE_FLOW_EXE.getNodeId(), ChangeFlowEnum.CHANGE_FLOW_CONFIRM.getNodeId(),
tomorrowSpecificTime);
if (CollectionUtils.isEmpty(records)) {
break;
}
records.forEach(this::progressRecord);
List<Long> idList = records.stream().map(ChangeRecord::getId).collect(Collectors.toList());
entityId = idList.stream().max(Long::compare).get();
count.addAll(idList);
}
} catch (Exception e) {
log.error("error on AutoSubmit,e:{}", e);
}
log.info(
"AutoSubmit end, count:{}, maxId:{}, usedTime:{}", count.size(), entityId, DateUtils.getCurrentTime() - startTime);
return ReturnT.SUCCESS;
}
public void progressRecord(ChangeRecord changeRecord) {
Long flowId = changeRecord.getFlowId();
String flowNode = changeRecord.getFlowNode();
String uid = changeRecord.getChangeCommander();
// 执行变更节点,提交节点
if (ChangeFlowEnum.CHANGE_FLOW_EXE.getNodeId().equals(flowNode)) {
// 获取工单详情
FlowDataDTO flowDataDTO = flowService.flowDetail(flowId.toString());
if (flowDataDTO == null) {
log.debug("[progressRecord] get flowDataDTO error, flowId{}", flowId);
}
// 工单流传
Map<String, Object> content = new HashMap<>(CommonConstants.INIT_HASH_MAP_SIZE);
content.put("updateTime", System.currentTimeMillis());
content.put(CommonConstants.FLOW_OPERATION_KEY, FlowOperationTypeEnum.PASS.getValue());
try {
String execNode = flowService.submitFlow(flowId.toString(), flowDataDTO, uid,
ChangeFlowEnum.CHANGE_FLOW_EXE.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", changeRecord.getCreateTime());
// 更新工单数据
changeRecord.setFlowNode(execNode);
changeRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowService.updateRecord(changeRecord);
} catch (Exception e) {
log.debug("[progressRecord] submit error, flowId{}", flowId);
}
}
// 发送邮件
HashMap<String, Object> map = new HashMap<>();
map.put("changeId", changeRecord.getFlowId());
map.put("changeSubject", ChangeSubjectEnum.getChangeSubjectEnum(changeRecord.getChangeSubject()).getDesc());
map.put("flowUrl", changeRecord.getFlowId());
ChangeConfigPo changeConfigPo = null;
StringBuilder changeType = new StringBuilder();
try {
changeConfigPo = changeConfigService.queryInfoPo(changeRecord.getParentChangeClassId(),
changeRecord.getSonChangeClassId());
changeType.append(changeConfigPo.getChangeTypes().get(0).getTypeName());
changeType.append(changeConfigPo.getChangeTypes().get(1).getTypeName());
} catch (Exception e) {
log.error("queryInfoPo parentId:{}, sonId:{}, error:{}", changeRecord.getParentChangeClassId(),
changeRecord.getSonChangeClassId(), JSON.toJSONString(changeConfigPo));
}
String subjectParam = ChangeSubjectEnum.getChangeSubjectEnum(changeRecord.getChangeSubject()).getDesc() + changeType
+ changeRecord.getFlowId().toString();
// 变更结果确认,收件人:变更负责人
List<String> receiver = Collections.singletonList(changeRecord.getChangeCommander());
// 变更结果确认,抄送:所有行动项负责人+变更管理QM
List<ChangeFlowExecVO> execRecord = changeFlowExecService
.getChangeFlowExecRecord(changeRecord.getId());
List<String> userEmailList = execRecord.stream().map(ChangeFlowExecVO::getChangeExecUserEmail)
.collect(Collectors.toList());
userEmailList.add(appConfig.getChangeManageQM());
changeFlowBiz.qcSendEmail(receiver, userEmailList, subjectParam,
EmailTemplateEnum.YX_QC_CHANGE_AFFIRM, map);
// 发送邮件,执行邮件更新为已发送
changeRecord.setAutoSubmitEmail(1);
changeFlowService.updateRecord(changeRecord);
// 如果是供应商发起,再次发送供应商邮件
if (changeRecord.getCreateSource().equals(CreateSourceEnum.TONG_ZHOU.getType())) {
sendSupplierEmail.sendSupplierEmail(changeRecord.getCreateSupplier(), subjectParam,
EmailTemplateEnum.YX_QC_CHANGE_AFFIRM, map);
}
// 如果是其他端发起但是是供应商变更,再次发送供应商邮件
if (!changeRecord.getCreateSource().equals(CreateSourceEnum.TONG_ZHOU.getType())
&& ChangeSubjectEnum.SUPPLIER.getType().equals(changeRecord.getChangeSubject())) {
sendSupplierEmail.sendSupplierEmail(changeRecord.getChangeSupplier(), subjectParam,
EmailTemplateEnum.YX_QC_CHANGE_AFFIRM, map);
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!-- scan dschedule config package -->
<!-- <context:component-scan base-package="com.netease.mail.yanxuan.dschedule.core.config">-->
<!-- </context:component-scan>-->
<!-- dschedule执行器 -->
<!-- <bean id="dscheduleExecutor"-->
<!-- class="com.netease.mail.yanxuan.dschedule.core.executor.DscheduleExecutor"-->
<!-- init-method="start" destroy-method="destroy"/>-->
</beans>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="60 seconds">
<contextName>yanxuan-qc-change-system</contextName>
<!--引入missa-->
<springProfile name="!dev">
<include resource="logback-missa.xml"/>
</springProfile>
<!-- 获取application配置文件中的配置 -->
<springProperty scope="context" name="log.level"
source="log.level"/>
<springProperty scope="context" name="log.path"
source="log.path"/>
<springProperty scope="context" name="log.maxHistory"
source="log.maxHistory"/>
<springProperty scope="context" name="log.maxSize"
source="log.maxSize"/>
<!--日志平台应用日志标准格式-->
<property name="patternValue"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] [%X{XTraceId}] %m%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${patternValue}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--默认日志输出 -->
<appender name="default" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/default.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/default.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${patternValue}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--默认异步日志输出 -->
<appender name="default_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 提取调用者数据 -->
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="default"/>
</appender>
<root level="${log.level}">
<appender-ref ref="console"/>
<appender-ref ref="default_ASYNC"/>
</root>
</configuration>
package com.netease.mail.yanxuan.change.common.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author lfmu
*/
@Target(value = { ElementType.TYPE_PARAMETER, ElementType.FIELD })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface ExcelTitleName {
/**
* 表头列名
*/
String title() default "";
/**
* 列数
*/
int order() default -1;
}
/**
* @(#)UserHolder.java, 2020/12/9.
* <p/>
* Copyright 2020 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.bean;
import org.springframework.stereotype.Component;
/**
* B端管理系统用户信息
*
* @author: 莫闲
* @date: 2020-12-09 13:19
**/
@Component
public class AdminUserHolder {
// 当前登录用户名线程绑定
private static ThreadLocal<String> userThreadLocal = new ThreadLocal<>();
public static void clear() {
userThreadLocal.remove();
}
/**
* 获取用户名
*
* @return 用户名,null-未登录
*/
public static String getUserName() {
return userThreadLocal.get();
}
public static void setUserName(String userName) {
userThreadLocal.set(userName);
}
}
package com.netease.mail.yanxuan.change.common.bean;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @author lwtang
*/
@EqualsAndHashCode()
@Data
@Accessors(chain = true)
public class AjaxResult<T> {
private static final long serialVersionUID = 1L;
private Integer code;
private String msg;
private T data;
private Exception e;
public Boolean isSuccess() {
return this.code.equals(ResponseCodeEnum.SUCCESS.getCode());
}
public Boolean isFail() {
return !isSuccess();
}
public static <R> AjaxResult<R> success() {
return AjaxResult.of(ResponseCodeEnum.SUCCESS);
}
public static <R> AjaxResult<R> success(R data) {
return AjaxResult.<R>of(ResponseCodeEnum.SUCCESS).setData(data);
}
public static <R> AjaxResult<R> error() {
return AjaxResult.of(ResponseCodeEnum.INTERNAL_ERROR);
}
public static <R> AjaxResult<R> error(Exception e) {
return AjaxResult.<R>of(ResponseCodeEnum.INTERNAL_ERROR).setE(e);
}
public static <R> AjaxResult<R> badRequest() {
return AjaxResult.of(ResponseCodeEnum.BAD_REQUEST);
}
public static <R> AjaxResult<R> badRequest(String msg) {
return AjaxResult.<R>of(ResponseCodeEnum.BAD_REQUEST).setMsg(msg);
}
public static <R> AjaxResult<R> badRequest(Exception e) {
return AjaxResult.<R>of(ResponseCodeEnum.BAD_REQUEST).setE(e);
}
public static <R> AjaxResult<R> badRequest(String msg, Exception e) {
return AjaxResult.<R>of(ResponseCodeEnum.BAD_REQUEST).setMsg(msg).setE(e);
}
public static <R> AjaxResult<R> of(ResponseCodeEnum code) {
return new AjaxResult<R>().setCode(code.getCode()).setMsg(code.getMsg());
}
public static <R> AjaxResult<R> of(Integer code, String msg) {
return new AjaxResult<R>().setCode(code).setMsg(msg);
}
public static <R> AjaxResult<R> of(Integer code, String msg, R data) {
return AjaxResult.<R>of(code, msg).setData(data);
}
public static <R> AjaxResult<R> of(Integer code, String msg, R data, Exception e) {
return AjaxResult.of(code, msg, data).setE(e);
}
}
/**
* @(#)CommonConstants.java, 2022/11/11.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.bean;
/**
* @Author zcwang
* @Date 2022/11/11
* 常量配置
*/
public class CommonConstants {
// 工单业务数据操作key
public static final String FLOW_OPERATION_KEY = "operation";;
public static final int INIT_HASH_MAP_SIZE = 10;
public static Integer SIZE = 1;
public static Integer PAGE = 10;
public static String FLOWX_PRODUCT = "qc";
public static final String ITEM_QC_CATEGORY_CACHE = "item_qc_category_cache:%s";
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.bean;
/**
* @author: bndong
* @date: 2021/5/25
*/
public class RequestLocalBean {
/**
* 存储当前的用户的Id
*/
private static final ThreadLocal<Long> userIdLocal = new ThreadLocal<>();
/**
* 存储当期用户的uid
*/
private static final ThreadLocal<String> uidLocal = new ThreadLocal<>();
/**
* 存储当前请求的ip信息
*/
private static final ThreadLocal<String> ipLocal = new ThreadLocal<>();
/**
* 真实姓名
*/
private static final ThreadLocal<String> nameLocal = new ThreadLocal<>();
/**
* 最近登录时间
*/
private static final ThreadLocal<Long> lastLoginTimeLocal = new ThreadLocal<>();
public static void rmrRequestUserId() {
userIdLocal.remove();
}
public static Long getRequestUserId() {
return userIdLocal.get();
}
public static void setRequestUserId(Long userId) {
userIdLocal.set(userId);
}
public static void rmrRequestIp() {
ipLocal.remove();
}
public static String getRequestIp() {
return ipLocal.get();
}
public static void setRequestIp(String ip) {
ipLocal.set(ip);
}
public static void rmUid() {
uidLocal.remove();
}
public static String getUid() {
return uidLocal.get();
}
public static void setUid(String uid) {
uidLocal.set(uid);
}
public static void rmrName() {
nameLocal.remove();
}
public static String getName() {
return nameLocal.get();
}
public static void setName(String name) {
nameLocal.set(name);
}
public static void rmrLastLoginTime() {
lastLoginTimeLocal.remove();
}
public static Long getLastLoginTime() {
return lastLoginTimeLocal.get();
}
public static void setLastLoginTime(Long lastLoginTime) {
lastLoginTimeLocal.set(lastLoginTime);
}
public static void clear() {
RequestLocalBean.rmUid();
RequestLocalBean.rmrRequestIp();
RequestLocalBean.rmrRequestUserId();
RequestLocalBean.rmrName();
RequestLocalBean.rmrLastLoginTime();
}
}
package com.netease.mail.yanxuan.change.common.bean;
/**
* 返回的code
*
* @author lwtang
*/
public enum ResponseCode {
//成功
SUCCESS(200, "SUCCESS"),
// 结果、数据为空
EMPTY(201, "EMPTY"),
// 处理中
PROCESSING(202, "PROCESSING"),
//已存在
HAVE_EXIST(203, "用户{0}存在未完成任务"),
//商品已售罄
SELL_OUT(210, "SELL_OUT"),
//已加购过该福袋
HAVE_ADD(211, "HAVE_ADD"),
//购物车已满
IS_FULL(212, "IS_FULL"),
//拥有补签卡达上限
CARD_FULL(213, "CARD_FULL"),
NO_TITLE_INFO(214, "标题信息缺失"),
QUERY_FILL_CHECK_CARDS_EXCEPTION(215, "获取补签卡异常"),
SKU_NO_EXIST(216, "skuId不存在"),
HAVE_SIGN(217, "签到失败"),
NO_IN_HAND_TASK(218, "没有进行中的任务"),
NO_TASK_ID(219, "该任务不存在"),
TASK_AWARD_HAVE_CASH(220, "任务奖励已兑换"),
ACTIVITY_CLOSE(221, "活动关闭"),
N0_LOTTERY(222, "无抽奖资格"),
NO_LOTTERY_COUNT(223, "无抽奖次数"),
LOTTERY_ERROR(224, "抽奖失败"),
SEND_RED_PACKED_FAIL(225, "发红包失败"),
NO_SELECT_GOOD_POWER(226, "没有选商品的资格"),
SEND_GIFT_CARD_FAIL(227, "发福利卡失败"),
SEND_COUPON_FAIL(228, "发优惠券失败"),
SEND_POINT_FAIL(229, "发积分失败"),
SEND_BACK_GOLD_FAIL(230, "发回馈金失败"),
NO_WAIT_RECEIVE(231, "无待领取"),
PARAM_MISS(232, "参数缺失"),
//----------3xx-----------
//----------4xx-----------
//非法参数.
BAD_REQUEST(400, "BAD REQUEST"),
//未登录
NOT_LOGIN(401, "NO UID"),
//重复提交
APPLYED(402, "APPLYED"),
// 禁用,token验证失败等; 内部接口认证:非法访问
FORBIDDEN(403, "FORBIDDEN"),
// 未找到资源,具体跟业务场景有关,比如红包不存在
NOT_FOUND(404, "NOT FOUND"),
// 没有资格,如等级不够
UNQULIFIED(405, "UNQULIFIED"),
// 资源不够
RUNOUT(406, "RUNOUT"),
// 请求受限、余额不足
LIMIT(407, "LIMIT"),
//该crmId在数据库已存在
SAME_CRM_ID(408, "该crmId在数据库已存在"),
// 风控异常, UGC检查失败等
RISK(411, "RISK"),
UNIQUE_KEY(412, "唯一索引异常"),
//----------5xx-----------
// 服务器错误: db异常等
SERVER_ERROR(500, "SERVER ERROR"),
//----------others-----------
// 限流
RATE_LIMIT(700, "RATE_LIMIT"),
THIRD_ERR(800, "rpc error"),
CANT_USE(801, "激活码id 不可用"),
NO_GOOD_TASK(802, "不是商品任务"),
//----------10xx-----------
CREATE_FLOW_ERROR(1001, "创建工单错误"),
DETAIL_FLOW_ERROR(1002, "查询工单详情错误"),
ERROR_FLOW_ID(1003, "工单id不存在"),
NODE_ERROR(1004, "工单已流转至其他节点"),
NO_AUTH(1005, "没有当前节点操作权限"),
CHANGE_SUBJECT_ERROR(1006, "变更主体类型错误"),
CHANGE_TYPE_NOT_EXIST(1007, "变更类型不存在"),
OPERATOR_NOT_EXIST(1008, "操作人不存在"),
CREATE_TODO_ERROR(1009, "传单待办错误"),
COMMANDER_TYPE_NOT_EXIST(1010,"变更负责人类型错误"),
SUBMIT_FLOW_ERROR(1011, "提交工单错误"),
/**
* 无权限
*/
NO_PERMISSION(2001,"无权限") {
},
CAN_NOT_DEL(2002,"不可删除") {
},
UPDATE_FAIL(2003,"更改失败") {
},
CANT_FOUND(2004,"查询不到") {
},
SEND_FAIL(2005,"发送失败") {
},
ACT_END(2006,"活动结束") {
},
/**
* 操作记录不存在
*/
OP_RECORD_NOT_EXIST(3000,"opRecord id not existed") {
},
/**
* 只有操作成功才允许进行验证
*/
ONLY_OP_SUCCESS_ALLOWED(3001,"verify only allowed when op success") {
},
PARAMETER_LENGTH(413,"请检查参数长度") {
},
EXEC_CONFIG_LENGTH(414,"请检查行动方案配置数量") {
},
PARAMETER_DEFICIENCY(415,"参数缺失请检查参数") {
},
CHANGE_TYPE_NAME_ONE(4001,"一级变更类型重复,请检查后添加~") {
},
CHANGE_TYPE_NAME_TOW(4002,"二级变更类型重复,请检查后添加~") {
};
private int code;
private String msg;
ResponseCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
/**
* @(#)ResponseCodeEnum.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.bean;
import java.util.HashMap;
import java.util.Map;
/**
* @Author zcwang
* @Date 2022/11/14
*/
public enum ResponseCodeEnum {
ZERO_CODE_SUCCESS(0, "成功"),
SUCCESS(200, "成功"),
BAD_REQUEST(400, "错误请求"),
SC_UNAUTHORIZED(401, "用户未登录"),
FORBIDDEN(403, "操作无权限"),
NO_FOUND(404, "服务器上没有请求的资源"),
TOO_MANY_REQUESTS(429, "服务请求达到上限(限流)"),
INTERNAL_ERROR(500, "系统内部错误"),
SERVICE_DEGRADATION(50010, "服务已降级"),
PARAM_ERROR(51000, "参数错误"),
NO_ROLE_AUTH(51006, "用户无角色权限"),
UNAUTHORIZED(51007, "用户未登录"),
RISK_CONTROL_USERS(51010, "风控用户"),
NO_CROWD_AUTH(51011, "用户人群不满足"),
ACT_DISSATISFIED(52000, "活动不满足条件"),
BIZ_EXCEPTION(52001, "业务异常"),
SYSTEM_EXCEPTION(52002, "系统异常"),
UNKNOWN_ERROR(52003, "未知错误"),
RPC_ERROR(52004, "rpc错误"),
RPC_RESULT_ERROR(52003, "rpc结果错误"),
FRAMEWORK_EXCEPTION(55000, "martech-act-framework异常");
private final Integer code;
private final String msg;
static Map<Integer, ResponseCodeEnum> map = new HashMap();
private ResponseCodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static ResponseCodeEnum valueOf(Integer value) {
return (ResponseCodeEnum)map.get(value);
}
public int getCode() {
return this.code;
}
public String getMsg() {
return this.msg;
}
static {
ResponseCodeEnum[] var0 = values();
int var1 = var0.length;
for(int var2 = 0; var2 < var1; ++var2) {
ResponseCodeEnum codeEnum = var0[var2];
map.put(codeEnum.getCode(), codeEnum);
}
}
}
\ No newline at end of file
/**
* @(#)BusinessFormEnum.java, 2022/12/20.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/20
*/
public enum BusinessFormEnum {
SELF_SUPPORT(0,"自营"),
YX_SELECTION_OEM(3,"严选贴牌代销"),
OTHER_BRANDS(4,"他方品牌代销"),
COMMISSION2(5,"代销2.0");
private Integer type;
private String desc;
BusinessFormEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
public static String getByType(Integer type) {
for (BusinessFormEnum value : BusinessFormEnum.values()) {
if (value.getType().equals(type)) {
return value.getDesc();
}
}
return "";
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.enums;
/**
* @author WangJiaXiang
* @date 2022/11/18/018$
*/
public enum ChangeCommanderEnum {
COMMANDER_ORIGINATOR(1,"发起人"),
FIXED_PERSON(2,"固定人"),
GOODS_ASSOCIATED(3,"商品关联角色"),
SUPPLIERS_ASSOCIATED(4,"供应商关联角色");
ChangeCommanderEnum(Integer id, String name) {
this.id = id;
this.name = name;
}
private Integer id;
private String name;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public static ChangeCommanderEnum getChangeCommanderEnum(Integer id){
for (ChangeCommanderEnum day : ChangeCommanderEnum.values()) {
if (id.equals(day.getId())){
return day;
}
}
return null;
}
}
/**
* @(#)ChangeFlowEnum.java, 2022/11/16.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
import lombok.Getter;
/**
* @Author zcwang
* @Date 2022/11/16
*/
public enum ChangeFlowEnum {
CHANGE_FLOW("0000", "全链路变更", "qc-change-flow"),
CHANGE_FLOW_START("79560500", "开始节点", "qc-change-flow"),
CHANGE_FLOW_SUBMIT("79560501", "变更申请提交", "qc-change-flow"),
CHANGE_FLOW_EXE("79560502","变更执行", "qc-change-flow"),
CHANGE_FLOW_CONFIRM("79560503","变更结果确认", "qc-change-flow"),
END("9999", "结束", "qc-change-flow");
@Getter
private final String nodeId;
private final String name;
@Getter
private final String topoId;
ChangeFlowEnum(String nodeId, String name, String topoId) {
this.nodeId = nodeId;
this.name = name;
this.topoId = topoId;
}
public static ChangeFlowEnum getByNodeId(String nodeId) {
for (ChangeFlowEnum value : ChangeFlowEnum.values()) {
if (value.getNodeId().equals(nodeId)) {
return value;
}
}
return null;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.enums;
/**
* @author WangJiaXiang
* @date 2022/11/16/016$
*/
public enum ChangeLevelEnum {
PRINCIPAL(1,"重要变更"),
ORDINARY(2,"一般变更");
private Integer type;
private String desc;
ChangeLevelEnum(Integer status, String desc) {
this.type = status;
this.desc = desc;
}
public Integer getStatus() {
return type;
}
public String getDesc() {
return desc;
}
}
package com.netease.mail.yanxuan.change.common.enums;
/**
* @author WangJiaXiang
* @date 2022/12/6/006$
*/
public enum ChangePrincipalEnum {
GOODS_BU(1,"商品开发"),
PURCHASE(2,"采购"),
PROSPECTUS(3,"计划"),
SQE(4,"SQE");
ChangePrincipalEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
private Integer type;
private String name;
public Integer getType() {
return type;
}
public String getName() {
return name;
}
}
/**
* @(#)ChangeResultEnum.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/21
*/
public enum ChangeResultEnum {
FINISH_ALL(1, "完成变更管理,风险可控,可实施变更"),
FINISH_PART(2, "完成变更管理,部分风险不可控,待修订变更方案"),
CANCEL(3, "不通过,变更取消"),
DELAY(4, "延期确认");
private Integer status;
private String desc;
ChangeResultEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public static ChangeResultEnum getByStatus(Integer status) {
for (ChangeResultEnum value : ChangeResultEnum.values()) {
if (value.getStatus().equals(status)) {
return value;
}
}
return null;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}
\ No newline at end of file
/**
* @(#)ChangeStateEnum.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/14
*/
public enum ChangeStatusEnum {
IN(1, "进行中"),
CANCEL(2, "取消完结"),
DELAY(3, "延期"),
END(4, "完结"),
WAIT(5, "待发起");
private Integer status;
private String desc;
ChangeStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}
\ No newline at end of file
/**
* @(#)ChangeSubjectEnum.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/14
* 变更主体枚举
*/
public enum ChangeSubjectEnum {
PRODUCT(1, "商品变更"),
SUPPLIER(2, "供应商变更"),
OTHER(3, "其他变更");
private Integer type;
private String desc;
ChangeSubjectEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
public static ChangeSubjectEnum getByType(Integer type) {
for (ChangeSubjectEnum value : ChangeSubjectEnum.values()) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
}
public static String getDescByType(Integer type) {
for (ChangeSubjectEnum value : ChangeSubjectEnum.values()) {
if (value.getType().equals(type)) {
return value.getDesc();
}
}
return "";
}
public static ChangeSubjectEnum getChangeSubjectEnum(Integer id){
for (ChangeSubjectEnum day : ChangeSubjectEnum.values()) {
if (id == day.getType()){
return day;
}
}
return ChangeSubjectEnum.OTHER;
}
}
\ No newline at end of file
/**
* @(#)CreateSourceEnum.java, 2022/12/7.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/7
*/
public enum CreateSourceEnum {
QC(1, "网易QC端"),
TONG_ZHOU(2, "同舟端"),
PRODUCT(3, "商品端");
private Integer type;
private String desc;
CreateSourceEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
}
\ No newline at end of file
/**
* @(#)FileTypeEnum.java, 2022/11/14.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/14
*/
public enum FileTypeEnum {
CHANGE(1, "变更前后图片/视频"),
UPLOAD(2, "发起变更资料上传"),
CHANGE_RESULT(3, "基础信息资料"),
CHANGE_RESULT_INFO(4, "变更结果资料");
private Integer type;
private String desc;
FileTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.enums;
import lombok.AllArgsConstructor;
/**
* @author tangld
* 工单操作类型
*/
@AllArgsConstructor
public enum FlowOperationTypeEnum {
/**
* 通过
*/
PASS("pass"),
/**
* 驳回
*/
REFUSE("refuse"),
/**
* 转交
*/
DELIVER("deliver");
private String value;
public String getValue() {
return value;
}
}
package com.netease.mail.yanxuan.change.common.enums;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum FlowxOperationEnum {
/**
* 创建成功
*/
CREATE(1, "创建成功"),
/**
* 提交工单
*/
SUBMIT(2, "提交工单"),
/**
* 审核通过
*/
APPROVE(3, "审核通过"),
/**
* 审批不通过
*/
APPROVE_FAIL(4, "审批不通过"),
/**
* 驳回
*/
REFUSE(5, "驳回"),
/**
* 转交
*/
DELIVER(6, "转交"),
/**
* 系统自动提交
*/
SYSTEM(7, "系统自动提交工单");
/**
* 类型
*/
private Integer type;
/**
* 名称
*/
private String name;
public Integer getType() {
return type;
}
public String getName() {
return name;
}
}
/**
* @(#)ItemSetupTypeEnum.java, 2022/12/20.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/20
*/
public enum ItemSetupTypeEnum {
normal(0, "正常立项商品"),
special(2, "特殊免立项商品"),
combination(3, "组合装");
private Integer type;
private String desc;
ItemSetupTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
public static String getByType(Integer type) {
for (ItemSetupTypeEnum value : ItemSetupTypeEnum.values()) {
if (value.getType().equals(type)) {
return value.getDesc();
}
}
return "";
}
}
\ No newline at end of file
/**
* @(#)MainSpuStatusEmum.java, 2022/12/20.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/20
*/
public enum MainSpuStatusEnum {
INIT(0,"未上架"),
NOT_ON_SHELVES(3,"未上架"),
ON_SHELVES(4,"已上架"),
PRESHELVING(5,"预上架");
private Integer status;
private String desc;
MainSpuStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
public static String getByStatus(Integer status) {
for (MainSpuStatusEnum value : MainSpuStatusEnum.values()) {
if (value.getStatus().equals(status)) {
return value.getDesc();
}
}
return "";
}
}
\ No newline at end of file
/**
* @(#)NeedFileEnum.java, 2022/11/15.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/15
*/
public enum NeedFileEnum {
NEED(1, "需要上传文件"),
NOT_NEED(2, "无需上传文件");
private Integer status;
private String desc;
NeedFileEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
}
\ No newline at end of file
/**
* @(#)OperateType.java, 2022/11/28.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/11/28
*/
public enum OperateTypeEnum {
FINISH(1, "完成"),
CANCEL(2, "取消"),
DELIVER(3, "转交"),
DALAY(4, "延期"),
SAVE(7, "保存");
private Integer type;
private String desc;
OperateTypeEnum(Integer type) {
this.type = type;
}
OperateTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
}
\ No newline at end of file
/**
* @(#)ProfitTypeEnum.java, 2022/12/2.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/2
*/
public enum ProfitTypeEnum {
RISK_CONTROL(1, "风险控制类"),
REDUCE_COST(2, "降本类"),
PRODUCT_IMPROVE(3, "商品改善"),
REPLACE_CERTIFICATES_WHEN_EXPIRE(4, "证件到期更换"),
OTHER(5, "其他"),
NO(6, "无");
private Integer type;
private String desc;
ProfitTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
public static String getByType(Integer type) {
for (ProfitTypeEnum value : ProfitTypeEnum.values()) {
if (value.getType().equals(type)) {
return value.getDesc();
}
}
return "";
}
}
\ No newline at end of file
/**
* @(#)SupplierChangePrincipalEnum.java, 2022/12/19.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.enums;
/**
* @Author zcwang
* @Date 2022/12/19
*/
public enum SupplierChangePrincipalEnum {
PURCHASE(1,"采购"),
PROSPECTUS(2,"计划"),
SQE(3,"SQE"),
GOODS_BU(4,"商品开发");
SupplierChangePrincipalEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
private Integer type;
private String name;
public Integer getType() {
return type;
}
public String getName() {
return name;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.enums;
/**
* 待办任务类型枚举值
*
* @author dmx
*/
public enum TodoTaskTypeEnum {
QC_CHANGE("101", "变更工单处理");
TodoTaskTypeEnum(String value, String desc) {
this.value = value;
this.desc = desc;
}
private final String value;
private final String desc;
public String getValue() {
return value;
}
}
......@@ -4,4 +4,4 @@
* @author 莫闲.
* @date 2021/1/29.
*/
package com.netease.mail.yanxuan.change.biz.meta.enums;
package com.netease.mail.yanxuan.change.common.enums;
/**
* @(#)ExcelUtil.java, 2022/7/5.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.common.util;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.web.multipart.MultipartFile;
import com.netease.mail.dp.des.common.api.enums.ExcelCellType;
import com.netease.mail.dp.des.process.api.entity.ExcelCell;
import com.netease.mail.dp.des.process.api.entity.ExcelTitle;
import com.netease.mail.yanxuan.change.common.anno.ExcelTitleName;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
/**
* @author ysl (wb.yeshunliang01@mesg.corp.netease.com)
*/
public class ExcelUtil {
private static final List<Field> NULL_FIELDS = Collections.emptyList();
private static Map<Class<?>, List<Field>> annotedFieldMap = new ConcurrentHashMap<>(4);
/**
* 解析excel,转换成list
* @param file
* @param clazz
* @param <T>
* @return
*/
public static <T> List<T> parseExcelList(MultipartFile file, Class<T> clazz) {
List<T> list;
try {
InputStream inputStream = file.getInputStream();
ImportParams importParams = new ImportParams();
list = ExcelImportUtil.importExcel(inputStream, clazz, importParams);
} catch (Exception e) {
throw new IllegalArgumentException("上传的文件错误");
}
return list;
}
public static <T> ExcelTitle fetchExceltile(Class<T> clazz) {
if (clazz == null) {
throw new RuntimeException("clazz参数不能为空");
}
List<Field> sortedFields = fetchAnnotedFields(clazz);
if (sortedFields == NULL_FIELDS) {
throw new RuntimeException("未找到表头字段");
}
ExcelTitle excelTitle = new ExcelTitle();
List<ExcelCell> excelCells = new ArrayList<>();
sortedFields.forEach(field -> {
ExcelCell excelCell = new ExcelCell();
excelCell.setValue(field.getAnnotation(ExcelTitleName.class).title());
excelCell.setCellType(ExcelCellType.NORMAL);
excelCells.add(excelCell);
});
excelTitle.setTitle(excelCells);
return excelTitle;
}
private static <T> List<Field> fetchAnnotedFields(Class<T> clazz) {
if (annotedFieldMap.containsKey(clazz)) {
return annotedFieldMap.get(clazz);
}
Field[] fields = clazz.getDeclaredFields();
Map<Field, ExcelTitleName> fieldMap = new HashMap<>(4);
for (Field field: fields) {
ExcelTitleName column = field.getAnnotation(ExcelTitleName.class);
if (column == null) {
continue;
}
fieldMap.put(field, column);
}
if (fieldMap.isEmpty()) {
annotedFieldMap.put(clazz, NULL_FIELDS);
return NULL_FIELDS;
}
List<Field> fieldList = new ArrayList<>(fieldMap.keySet());
Collections.sort(fieldList, (field1, field2) -> {
ExcelTitleName column1 = fieldMap.get(field1);
ExcelTitleName column2 = fieldMap.get(field2);
return column1.order() - column2.order();
});
annotedFieldMap.put(clazz, fieldList);
return fieldList;
}
}
\ No newline at end of file
package com.netease.mail.yanxuan.change.common.util;
import java.io.BufferedReader;
import javax.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
/**
* @author cyZhao
* @date 2019/1/28
*/
public class RequestUtil {
public static final String CHAR_SET = "UTF-8";
private static final String POST_METHOD = "POST";
public static String getRequestPath(HttpServletRequest request) {
if (request == null) {
return null;
}
String path = request.getRequestURI();
String queryStr = request.getQueryString();
if (!StringUtils.isEmpty(queryStr)) {
path = path + "?" + queryStr;
}
if (POST_METHOD.equals(request.getMethod().toUpperCase())) {
String body = getRequestBody(request);
if (!StringUtils.isEmpty(body)) {
path += "\nbody: " + body;
}
}
return path;
}
private static String getRequestBody(HttpServletRequest request) {
StringBuffer json = new StringBuffer();
String line;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
json.append(line);
}
} catch (Exception e) {
}
return json.toString();
}
}
package com.netease.mail.yanxuan.change.common.util;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
/**
* @author cyZhao
* @date 2019/1/28
*/
public class ResponseUtil {
/**
* 输出json
*/
public static void writeJson(HttpServletResponse response, String json) throws IOException {
response.setContentType("application/json;charset=UTF-8");
response.setHeader("CACHE-CONTROL", "no-aspect");
response.getWriter().write(json);
response.flushBuffer();
}
/**
* 输出json
*/
public static void writeJson(HttpServletResponse response, Object json) throws IOException {
writeJson(response, JSONObject.toJSONString(json));
}
}
......@@ -17,22 +17,17 @@
<artifactId>yanxuan-qc-change-system-common</artifactId>
</dependency>
<!-- store-db
<!--store-db-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>netease.ddb</groupId>
<artifactId>db</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
-->
<!-- store-redis
<!--store-redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
......@@ -41,7 +36,6 @@
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
-->
</dependencies>
</project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment