Commit 53f964e8 by jx-art

Merge remote-tracking branch 'origin/feature-changeFlow-221110' into feature-changeFlow-221110

parents 17b19a1d a738bffe
......@@ -59,7 +59,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>
<!-- 子模块可选依赖 -->
......@@ -443,6 +444,12 @@
<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>
......
......@@ -44,3 +44,7 @@ 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
......@@ -42,3 +42,7 @@ 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
/**
* @(#)ChangeFlowExportCallback.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.callback;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.netease.mail.dp.des.process.api.entity.CallbackQueryReq;
import com.netease.mail.dp.des.process.api.entity.ExcelCell;
import com.netease.mail.dp.des.process.api.entity.ExcelTitle;
import com.netease.mail.dp.des.process.api.entity.PivotTable;
import com.netease.mail.dp.des.starter.callback.DesCallbackService;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowExportQuery;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService;
import com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum;
import com.netease.mail.yanxuan.change.common.util.ExcelUtil;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.entity.ChangeType;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowListQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ItemVO;
import com.netease.mail.yanxuan.change.integration.excel.ChangeFlowExcelDTO;
import com.netease.mail.yanxuan.change.integration.excel.ChangeFlowExcelVo;
import lombok.extern.slf4j.Slf4j;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Slf4j
@Component
public class ChangeFlowExportCallback implements DesCallbackService {
@Autowired
private ChangeRecordMapper changeRecordMapper;
@Autowired
private ChangeTypeService changeTypeService;
@Override
public ExcelTitle queryExcelTitle(CallbackQueryReq req) {
log.info("[op: change flow export callback queryExcelTitle] req={}", JSON.toJSONString(req));
ChangeFlowExportQuery query = JSON.parseObject(req.getParamJson(), ChangeFlowExportQuery.class);
ChangeFlowListQueryReq changeFlowListQueryReq = new ChangeFlowListQueryReq();
BeanUtils.copyProperties(query, changeFlowListQueryReq);
List<ChangeRecord> list = changeRecordMapper.selectByCondition(changeFlowListQueryReq);
ExcelTitle excelTitle = ExcelUtil.fetchExceltile(ChangeFlowExcelVo.class);
excelTitle.setTotal((long) list.size());
log.info("[op: change flow export callback queryExcelTitle] result={}", JSON.toJSONString(excelTitle));
return excelTitle;
}
@Override
public List<List<ExcelCell>> queryExcelData(CallbackQueryReq req) {
log.info("[op: address book export callback queryExcelData] req={}", JSON.toJSONString(req));
ChangeFlowExportQuery query = JSON.parseObject(req.getParamJson(), ChangeFlowExportQuery.class);
List<ChangeFlowExcelDTO> list = getExportList(query);
return list.stream().map(ChangeFlowExcelVo::init).collect(Collectors.toList());
}
private List<ChangeFlowExcelDTO> getExportList(ChangeFlowExportQuery query) {
ChangeFlowListQueryReq changeFlowListQueryReq = new ChangeFlowListQueryReq();
BeanUtils.copyProperties(query, changeFlowListQueryReq);
List<ChangeRecord> changeRecords = changeRecordMapper.selectByCondition(changeFlowListQueryReq);
if (CollectionUtils.isEmpty(changeRecords)) {
return Lists.newArrayList();
}
return changeRecords.stream().map(record -> {
ChangeFlowExcelDTO changeFlowExcelDTO = new ChangeFlowExcelDTO();
changeFlowExcelDTO.setId(record.getId());
changeFlowExcelDTO
.setChangeSubject(ChangeSubjectEnum.getChangeSubjectEnum(record.getChangeSubject()).getDesc());
ChangeType parentChangeType = changeTypeService.getChangeTypeById(record.getParentChangeClassId());
ChangeType sonChangeType = changeTypeService.getChangeTypeById(record.getSonChangeClassId());
changeFlowExcelDTO.setChangeType(parentChangeType.getTypeName() + ">" + sonChangeType.getTypeName());
changeFlowExcelDTO.setChangeDepartment(record.getChangeDepartment());
changeFlowExcelDTO.setChangeContent(record.getChangeContent());
changeFlowExcelDTO.setChangeCommander(record.getChangeCommander());
String changeItemJsonStr = record.getChangeItem();
if (StringUtils.isNotBlank(changeItemJsonStr)) {
List<ItemVO> itemVOS = JSON.parseArray(changeItemJsonStr, ItemVO.class);
changeFlowExcelDTO.setChangeItems(itemVOS.stream().map(item -> item.getItemId() + item.getItemName())
.collect(Collectors.joining(",")));
}
if (StringUtils.isNotBlank(record.getChangeSupplier())) {
changeFlowExcelDTO.setSupplier(record.getChangeSupplier());
}
changeFlowExcelDTO.setChangeState(record.getState());
// todo:变更发起人组织查询:姓名(组织架构三级部门)/供应商ID/system+发起时间
changeFlowExcelDTO.setChangeCreator(record.getCreator());
changeFlowExcelDTO.setExecDepartmentStrList(record.getParticipateChangeExecDepartment());
changeFlowExcelDTO.setCreateTime(record.getCreateTime());
return changeFlowExcelDTO;
}).collect(Collectors.toList());
}
@Override
public PivotTable queryPivotTable(CallbackQueryReq callbackQueryReq) {
return null;
}
}
\ No newline at end of file
......@@ -50,4 +50,7 @@ public class AppConfig {
*/
@Value("${changeManageQM:cuiyixian@corp.netease.com}")
private String changeManageQM;
@Value("${exportLimit:20}")
private Long exportLimit;
}
\ 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;
}
\ 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
......@@ -7,7 +7,6 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierInfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
......@@ -15,6 +14,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.change.biz.config.AppConfig;
......@@ -37,6 +37,7 @@ import com.netease.mail.yanxuan.change.dal.meta.model.vo.ItemVO;
import com.netease.mail.yanxuan.change.integration.flow.goods.ItemcenterApiRpcService;
import com.netease.mail.yanxuan.change.integration.flow.goods.PfuApiRpcService;
import com.netease.mail.yanxuan.change.integration.flow.goods.QcApiRpcService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierInfoService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierSendService;
import com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierRelatedUserReq;
import com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierUserRsp;
......@@ -120,7 +121,8 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
* @return
*/
private GoodsResponseRpc queryGoodsCommander(ChangeCommanderEnum commanderEnum,List<Long> goodsInfos,String commander){
if (commanderEnum.getId() != ChangeCommanderEnum.GOODS_ASSOCIATED.getId() || CollectionUtils.isEmpty(goodsInfos) || commander == null){
if (!commanderEnum.getId().equals(ChangeCommanderEnum.GOODS_ASSOCIATED.getId())
|| CollectionUtils.isEmpty(goodsInfos) || commander == null) {
return null;
}
Map<String,GoodsResponseRpc> map = new HashMap<String,GoodsResponseRpc>();
......@@ -318,7 +320,7 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
return commanderResponse;
case SUPPLIERS_ASSOCIATED:
String changeSupplier = req.getChangeSupplier();
Assert.isTrue(StringUtils.isNotBlank(changeSupplier), "变更负责人为供应商时,商品列表不可为空");
Assert.isTrue(StringUtils.isNotBlank(changeSupplier), "变更负责人为供应商时,供应商不可为空");
try {
GoodsResponseRpc supplierResponseRpc = queryChangeSupplier(changeCommanderEnum,
changeSupplier, changeExecUser);
......
package com.netease.mail.yanxuan.change.biz.service.impl.change;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService;
......@@ -104,7 +105,7 @@ public class AdminChangeConfigServiceImpl implements AdminChangeConfigService {
changeConfigVO = getChangeConfigVO(changeConfig, changeTypes, changeExecConfigs);
//如果没有查询后返回redis
getValue().set(CHANGE_CONFIG+id,changeConfigVO,1, TimeUnit.DAYS);
return AjaxResult.success(JSONObject.parseObject(changeConfigVO, ChangeConfigVO.class));
return AjaxResult.success(JSON.parseObject(changeConfigVO, ChangeConfigVO.class));
}
@Override
......
......@@ -42,13 +42,12 @@ public class SupplierSendService {
* @param emailTemplateEnum
* @param param
*/
public void sendSupplierEmail(ChangeRecord changeRecord, EmailTemplateEnum emailTemplateEnum, Map<String, Object> param) {
public void sendSupplierEmail(ChangeRecord changeRecord, EmailTemplateEnum emailTemplateEnum,
Map<String, Object> param) {
SupplierSendEmailReq req = new SupplierSendEmailReq();
req.setSupplierId(changeRecord.getChangeSupplier());
req.setMailSubject(String.format(emailTemplateEnum.getSubject(), changeRecord.getId()));
EmailFactor emailFactor = new EmailFactor();
EmailFactor factor = EmailFactor.builder()
.data(param).emailTemplateEnum(emailTemplateEnum)
EmailFactor factor = EmailFactor.builder().data(param).emailTemplateEnum(emailTemplateEnum)
.subject(req.getMailSubject()).type(EmailTypeEnum.HTML.getType()).build();
req.setMailContent(this.content(factor));
log.debug("[sendSupplierEmail] 发送供应商邮件内容 flowId:{}, req:{}", changeRecord.getFlowId(), JSON.toJSONString(req));
......
......@@ -20,11 +20,14 @@ import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
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.CreateSourceEnum;
import com.netease.mail.yanxuan.change.common.enums.FlowOperationTypeEnum;
import com.netease.mail.yanxuan.change.common.util.DateUtils;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
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;
......@@ -47,6 +50,12 @@ public class AutoSubmit extends IJobHandler {
@Autowired
private FlowService flowService;
@Autowired
private ChangeFlowBiz changeFlowBiz;
@Autowired
private SupplierSendService sendSupplierEmail;
@Override
public ReturnT<String> execute(String... strings) throws Exception {
log.info("AutoSubmit start");
......@@ -100,6 +109,16 @@ public class AutoSubmit extends IJobHandler {
log.debug("[progressRecord] submit error, flowId{}", flowId);
}
}
// todo: 到达执行确认时间,发送邮件
// 发送邮件
HashMap<String, Object> map = new HashMap<>();
map.put("changeId", changeRecord.getId());
map.put("changeSubject", changeRecord.getChangeSubject());
map.put("flowUrl", changeRecord.getFlowId());
changeFlowBiz.qcSendEmail(changeRecord.getChangeCommander(), changeRecord.getId().toString(),
EmailTemplateEnum.YX_QC_CHANGE_AFFIRM, map);
// 如果是供应商,再次发送供应商邮件
if (changeRecord.getCreateSource().equals(CreateSourceEnum.QC.getType())) {
sendSupplierEmail.sendSupplierEmail(changeRecord, EmailTemplateEnum.YX_QC_CHANGE_AFFIRM, map);
}
}
}
\ No newline at end of file
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;
}
......@@ -8,7 +8,7 @@ public enum ChangeCommanderEnum {
COMMANDER_ORIGINATOR(1,"发起人"),
FIXED_PERSON(2,"固定人"),
GOODS_ASSOCIATED(3,"品关联角色"),
GOODS_ASSOCIATED(3,"品关联角色"),
SUPPLIERS_ASSOCIATED(4,"供应商关联角色");
ChangeCommanderEnum(Integer id, String name) {
......
......@@ -6,7 +6,7 @@ package com.netease.mail.yanxuan.change.common.enums;
*/
public enum ChangePrincipalEnum {
GOODS_BU(1,"商品BU"),
GOODS_BU(1,"商品开发"),
PURCHASE(2,"采购"),
PROSPECTUS(3,"计划"),
SQE(4,"SQE");
......
/**
* @(#)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
......@@ -54,7 +54,7 @@ public class ChangeExecRecord {
private String changeExecUser;
/**
* 变更行动人(不同类型存储不同内容)
* 变更行动人邮箱
*/
private String changeExecUserEmail;
......
......@@ -39,7 +39,7 @@ public class ChangeFlowListQueryReq {
/**
* 工单状态
*/
private Integer state;
private Integer changeState;
/**
* 变更负责人
......
/**
* @(#)ChangeFlowRequest.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.dal.meta.model.req;
import com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Data
public class ChangeFlowRequest {
/**
* 变更商品(变更主体为商品时有效)
*/
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;
private String serviceCode;
private String uid;
}
\ No newline at end of file
......@@ -60,8 +60,8 @@
<if test="sonChangeClassId != null">
and son_change_class_id = #{sonChangeClassId}
</if>
<if test="state != null">
and `state` = #{state}
<if test="changeState != null">
and `state` = #{changeState}
</if>
<if test="changeCommander != null and changeCommander != ''">
and `change_commander` = #{changeCommander}
......@@ -78,6 +78,7 @@
<if test="endTime != null">
and create_time <![CDATA[ < ]]> #{endTime}
</if>
order by create_time desc
</where>
</select>
</mapper>
\ No newline at end of file
......@@ -11,15 +11,15 @@ public enum EmailTemplateEnum {
YX_QC_CHANGE_RELEASE_FLOW("yxqc_change_release_flow","发起变更","【待处理】%s 变更申请提交 "),
YX_QC_CHANGE_SUBMIT_CANCEL("yx_qc_change_submit_cancel","变更取消","【待处理】%s 变更申请提交 "),
YX_QC_CHANGE_SUBMIT_CANCEL("yx_qc_change_submit_cancel","变更取消","【待处理】%s 变更取消通知"),
YX_QC_CHANGE_SUBMIT_FORWARD("yx_qc_change_submit_forward","变更转交","%s 变更工单转交通知"),
YX_QC_CHANGE_EXECUTE(" yx_qc_change_execute","变更执行","【待处理】变更行动项确认 %s %s %s"),
YX_QC_CHANGE_EXECUTE(" yx_qc_change_execute","变更执行","【待处理】变更行动项确认 %s"),
YX_QC_CHANGE_AFFIRM("yx_qc_change_affirm","变更确认","【待处理】变更结果确认 %s %s %s"),
YX_QC_CHANGE_AFFIRM("yx_qc_change_affirm","变更确认","【待处理】变更结果确认 %s"),
YX_QC_CHANGE_FINISH("yx_qc_change_finish","工单完结","【已完结】%s %s %s 变更风险行动项已完结,请开始执行变更。"),
YX_QC_CHANGE_FINISH("yx_qc_change_finish","工单完结","【已完结】%s 变更风险行动项已完结,请开始执行变更。"),
YX_QC_CHANGE_PENDING("yx_qc_change_pending","待处理","【待处理】执行标准号 执行标准名称已变更 请排查对应的商品变更");
/**
......
......@@ -3,6 +3,7 @@ package com.netease.mail.yanxuan.change.integration.email.service;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum;
......@@ -19,8 +20,8 @@ public interface IEmailService {
* @param ccList 抄送人
* @param map 邮箱参数
* @param emailTemplateEnum 标题枚举
* @param subjectParams 标题参数
* @param subjectParam 标题参数
*/
void sendEmail(Collection<String> toList, Collection<String> ccList, HashMap<String, Object> map,
EmailTemplateEnum emailTemplateEnum, List<String> subjectParams);
void sendEmail(Collection<String> toList, Collection<String> ccList, Map<String, Object> map,
EmailTemplateEnum emailTemplateEnum, String subjectParam);
}
......@@ -5,13 +5,17 @@ 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.IEmailService;
import com.netease.mail.yanxuan.change.integration.email.service.UasClientService;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
......@@ -25,8 +29,8 @@ public class EmailServiceImpl implements IEmailService {
@Override
@Async("asyncEmail")
public void sendEmail(Collection<String> toList, Collection<String> ccList,
HashMap<String,Object> map, EmailTemplateEnum emailTemplateEnum, List<String>subjectParams) {
public void sendEmail(Collection<String> toList, Collection<String> ccList, Map<String, Object> map,
EmailTemplateEnum emailTemplateEnum, String subjectParam) {
EmailFactor emailFactor = new EmailFactor();
//固定
emailFactor.setType(EmailTypeEnum.TEXT.getType());
......@@ -42,8 +46,8 @@ public class EmailServiceImpl implements IEmailService {
}
String subject = emailFactor.getSubject();
//标题参数处理
if (subjectParams != null){
subject = String.format(subject,subjectParams.toArray());
if (Strings.isNotBlank(subjectParam)) {
subject = String.format(subject, subjectParam);
}
uasClient.sendEmail(subject, content, toList, ccList, null);
}
......
......@@ -28,6 +28,7 @@ public class UasClientServiceImpl implements UasClientService {
@Autowired
private EmailRpcService service;
@Override
public void sendEmail(String subject, String content, Collection<String> toList, Collection<String> ccList, List<File> fileList) {
if (!CollectionUtils.isEmpty(toList)) {
Map<String, String> params = new HashMap();
......
/**
* @(#)ChangeFlowExcelVo.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.integration.excel;
import java.util.ArrayList;
import java.util.List;
import com.netease.mail.dp.des.common.api.enums.ExcelCellType;
import com.netease.mail.dp.des.process.api.entity.ExcelCell;
import com.netease.mail.yanxuan.change.common.anno.ExcelTitleName;
import com.netease.mail.yanxuan.change.common.enums.ChangeStatusEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/12/8
*/
@Data
public class ChangeFlowExcelVo {
/**
* 主键id
*/
@ExcelTitleName(title = "主键id", order = 1)
private Long id;
/**
* 变更主体
* @see ChangeSubjectEnum
*/
@ExcelTitleName(title = "变更主体", order = 2)
private String changeSubject;
/**
* 变更类型,一级类型>二级类型
*/
@ExcelTitleName(title = "变更类型", order = 3)
private String changeType;
/**
* 变更负责部门名
*/
@ExcelTitleName(title = "变更负责部门名", order = 4)
private String changeDepartment;
/**
* 变更内容
*/
@ExcelTitleName(title = "变更内容", order = 5)
private String changeContent;
/**
* 变更负责人
*/
@ExcelTitleName(title = "变更负责人", order = 6)
private String changeCommander;
/**
* 变更商品列表,SPUID+商品名称
*/
@ExcelTitleName(title = "变更商品列表", order = 7)
private String changeItems;
/**
* 变更供应商,仅展示供应商ID,没有时展示为“/”
*/
@ExcelTitleName(title = "变更供应商", order = 8)
private String supplier;
/**
* 变更状态
* @see ChangeStatusEnum
*/
@ExcelTitleName(title = "变更状态", order = 9)
private Integer changeState;
/**
* 变更发起人
*/
@ExcelTitleName(title = "变更发起人", order = 10)
private String changeCreator;
/**
* 变更行动部门列表
*/
@ExcelTitleName(title = "变更行动部门列表", order = 11)
private String execDepartmentStrList;
/**
* 创建时间
*/
@ExcelTitleName(title = "创建时间", order = 12)
private Long createTime;
public static List<ExcelCell> init(ChangeFlowExcelDTO dto) {
List<ExcelCell> cellInfo = new ArrayList<>();
ExcelCell excelCell = new ExcelCell();
excelCell.setCellType(ExcelCellType.TEXT);
// id
excelCell.setValue(dto.getId());
cellInfo.add(excelCell);
// 变更主体
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeSubject());
cellInfo.add(excelCell);
// 变更类型
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeType());
cellInfo.add(excelCell);
// 变更负责部门名
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeDepartment());
cellInfo.add(excelCell);
// 变更内容
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeContent());
cellInfo.add(excelCell);
// 变更负责人
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeCommander());
cellInfo.add(excelCell);
// 变更商品列表
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeItems());
cellInfo.add(excelCell);
// 变更供应商
excelCell = new ExcelCell();
excelCell.setValue(dto.getSupplier());
cellInfo.add(excelCell);
// 变更状态
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeState());
cellInfo.add(excelCell);
// 变更发起人
excelCell = new ExcelCell();
excelCell.setValue(dto.getChangeCreator());
cellInfo.add(excelCell);
// 变更行动部门列表
excelCell = new ExcelCell();
excelCell.setValue(dto.getExecDepartmentStrList());
cellInfo.add(excelCell);
// 创建时间
excelCell = new ExcelCell();
excelCell.setValue(dto.getCreateTime());
cellInfo.add(excelCell);
return cellInfo;
}
}
\ No newline at end of file
......@@ -26,7 +26,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor).addPathPatterns("/**").excludePathPatterns("/i/health")
.excludePathPatterns("/change/flow/getOperator", "/test/createToDo","/test/progressTodo","/test/submit");
.excludePathPatterns("/change/flow/getOperator", "/test/**", "/api/des/callback/**");
registry.addInterceptor(adminUserLoginInterceptor).addPathPatterns("test/**");
}
......
......@@ -6,13 +6,11 @@
*/
package com.netease.mail.yanxuan.change.web.controller;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -22,15 +20,19 @@ import org.springframework.web.bind.annotation.RestController;
import com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz;
import com.netease.mail.yanxuan.change.biz.config.TitleConfig;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowExportQuery;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import com.netease.mail.yanxuan.change.biz.service.DESExportService;
import com.netease.mail.yanxuan.change.biz.service.InteriorChangeConfigService;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.common.bean.RequestLocalBean;
import com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum;
import com.netease.mail.yanxuan.change.dal.meta.model.po.QueryCommanderEmailReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCancelReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowDeliverReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowListQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowRequest;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowSubmitReq;
import com.netease.mail.yanxuan.change.dal.meta.model.rpc.CommanderResponse;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.BasicChangeFlowVO;
......@@ -59,6 +61,9 @@ public class ChangeFlowController {
@Autowired
private InteriorChangeConfigService interiorChangeConfigService;
@Autowired
private DESExportService desExportService;
/**
* 变更工单详情查询
*
......@@ -93,13 +98,13 @@ public class ChangeFlowController {
changeFlowListQueryReq.setSupplier(supplier);
changeFlowListQueryReq.setParentChangeClassId(parentChangeClassId);
changeFlowListQueryReq.setSonChangeClassId(sonChangeClassId);
changeFlowListQueryReq.setState(changeState);
changeFlowListQueryReq.setChangeState(changeState);
changeFlowListQueryReq.setChangeCommander(changeCommander);
changeFlowListQueryReq.setChangeDepartment(changeDepartment);
changeFlowListQueryReq.setChangeExecDepartment(changeExecDepartment);
changeFlowListQueryReq.setStartTime(startTime);
changeFlowListQueryReq.setEndTime(endTime);
// QC端可以查看所有,不加入过滤条件
// QC端可以查看所有,不加入过滤条件
if (!CreateSourceEnum.QC.getType().equals(createSource)) {
changeFlowListQueryReq.setCreateSource(createSource);
}
......@@ -175,8 +180,8 @@ public class ChangeFlowController {
*
* @return
*/
@PostMapping("/export")
public AjaxResult<Void> export(@RequestParam(name = "itemId", required = false) String itemId,
@GetMapping("/export")
public AjaxResult<String> export(@RequestParam(name = "itemId", required = false) String itemId,
@RequestParam(name = "supplier", required = false) String supplier,
@RequestParam(name = "parentChangeClassId", required = false) Long parentChangeClassId,
@RequestParam(name = "sonChangeClassId", required = false) Long sonChangeClassId,
......@@ -185,20 +190,35 @@ public class ChangeFlowController {
@RequestParam(name = "changeDepartment", required = false) String changeDepartment,
@RequestParam(name = "changeExecDepartment", required = false) String changeExecDepartment,
@RequestParam(name = "startTime", required = false) Long startTime,
@RequestParam(name = "endTime", required = false) Long endTime, HttpServletResponse response) {
ChangeFlowListQueryReq changeFlowListQueryReq = new ChangeFlowListQueryReq();
changeFlowListQueryReq.setItemId(itemId);
changeFlowListQueryReq.setSupplier(supplier);
changeFlowListQueryReq.setParentChangeClassId(parentChangeClassId);
changeFlowListQueryReq.setSonChangeClassId(sonChangeClassId);
changeFlowListQueryReq.setState(changeState);
changeFlowListQueryReq.setChangeCommander(changeCommander);
changeFlowListQueryReq.setChangeDepartment(changeDepartment);
changeFlowListQueryReq.setChangeExecDepartment(changeExecDepartment);
changeFlowListQueryReq.setStartTime(startTime);
changeFlowListQueryReq.setEndTime(endTime);
changeFlowBiz.export(changeFlowListQueryReq, response);
return AjaxResult.success();
@RequestParam(name = "endTime", required = false) Long endTime,
@RequestParam(name = "createSource", required = false, defaultValue = "1") Integer createSource,
@RequestParam(name = "serviceCode") String serviceCode) {
ChangeFlowRequest changeFlowRequest = new ChangeFlowRequest();
changeFlowRequest.setItemId(itemId);
changeFlowRequest.setSupplier(supplier);
changeFlowRequest.setParentChangeClassId(parentChangeClassId);
changeFlowRequest.setSonChangeClassId(sonChangeClassId);
changeFlowRequest.setChangeState(changeState);
changeFlowRequest.setChangeCommander(changeCommander);
changeFlowRequest.setChangeDepartment(changeDepartment);
changeFlowRequest.setChangeExecDepartment(changeExecDepartment);
changeFlowRequest.setStartTime(startTime);
changeFlowRequest.setEndTime(endTime);
changeFlowRequest.setServiceCode(serviceCode);
// QC端可以查看所有,不加入过滤条件
if (!CreateSourceEnum.QC.getType().equals(createSource)) {
changeFlowRequest.setCreateSource(createSource);
}
if (CreateSourceEnum.TONG_ZHOU.getType().equals(createSource)) {
Assert.isTrue(Strings.isNotBlank(supplier), "同舟端查询供应商id不可为空");
}
String s = this.exportAddressBook(changeFlowRequest);
return AjaxResult.success(s);
}
public String exportAddressBook(ChangeFlowRequest req) {
req.setUid(RequestLocalBean.getUid());
return desExportService.changeFlowExport(req);
}
/**
......
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