Browse Source

完成主子表导入

master
刘忱 2 years ago
parent
commit
b666823f4d
  1. 76
      win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java
  2. 8
      win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java
  3. 2
      win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/DictTypeConstants.java
  4. 27
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/PurchaseclaimRequestMainController.java
  5. 37
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestDetailExcelVO.java
  6. 22
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestImportErrorVO.java
  7. 113
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestImportVO.java
  8. 2
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestMainBaseVO.java
  9. 2
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestMainCreateReqVO.java
  10. 2
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/purchaseclaimRequest/PurchaseclaimRequestDetailConvert.java
  11. 2
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/purchaseclaimRequest/PurchaseclaimRequestMainService.java
  12. 42
      win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/purchaseclaimRequest/PurchaseclaimRequestMainServiceImpl.java

76
win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/listener/ExcelListener.java → win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java

@ -1,10 +1,7 @@
package com.win.framework.excel.core.listener; package com.win.framework.excel.core.util;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.win.framework.common.exception.ServiceException; import com.win.framework.common.exception.ServiceException;
import com.win.framework.excel.core.annotations.OnlyOne; import com.win.framework.excel.core.annotations.OnlyOne;
@ -22,7 +19,7 @@ import java.util.List;
@Data @Data
@Slf4j @Slf4j
public class ExcelListener<T> extends AnalysisEventListener<T> { public class ConvertUtil<T> {
/** /**
* excel数据 * excel数据
@ -47,19 +44,17 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
/** /**
* 子表class * 子表class
*/ */
private Class<?> subClass; private String subClassName;
/** /**
* 构造函数 * 构造函数
*/ */
@SuppressWarnings("unchecked") public ConvertUtil(Class<T> mainClass) {
public ExcelListener() {
dataList = new ArrayList<>(); dataList = new ArrayList<>();
this.mainClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; this.mainClass = mainClass;
} }
@Override public ConvertUtil<T> invoke(List<?> dataList) {
public void invoke(Object object, AnalysisContext analysisContext) {
if(this.methodName == null) { if(this.methodName == null) {
String methodName = this.getOnlyOneAnnotation(); String methodName = this.getOnlyOneAnnotation();
if(methodName == null) { if(methodName == null) {
@ -74,12 +69,10 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
} }
this.subObjectMethodName = subObjectMethodName; this.subObjectMethodName = subObjectMethodName;
} }
for(Object object : dataList) {
this.buildEntity(object); this.buildEntity(object);
} }
return this;
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
} }
/** /**
@ -105,22 +98,27 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
T mainObject = this.checkDataIsExist(vo); T mainObject = this.checkDataIsExist(vo);
Object subObject; Object subObject;
try {//创建子数据对象 try {//创建子数据对象
subObject = this.subClass.getDeclaredConstructors()[0].newInstance((Object) null); subObject = Class.forName(this.subClassName).newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
BeanUtil.copyProperties(vo, subObject); BeanUtil.copyProperties(vo, subObject);
if(mainObject == null) {//list中不存在主数据 if(mainObject == null) {//list中不存在主数据
try {//创建主数据对象 try {//创建主数据对象
mainObject = (T) this.mainClass.getDeclaredConstructors()[0].newInstance((Object) null); mainObject = (T) Class.forName(this.mainClass.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
BeanUtil.copyProperties(vo, mainObject); BeanUtil.copyProperties(vo, mainObject);
Method setMethod = ReflectUtil.getMethod(this.mainClass, "set" + this.subObjectMethodName); Method setMethod = null;
List<Object> subClassList = new ArrayList<>(); List<Object> subClassList = new ArrayList<>();
subClassList.add(subObject); subClassList.add(subObject);
ReflectUtil.invoke(mainObject, setMethod, subClassList); try {
setMethod = this.mainClass.getMethod("set" + this.subObjectMethodName, List.class);
setMethod.invoke(mainObject, subClassList);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
dataList.add(mainObject); dataList.add(mainObject);
} else {//list中存在主数据,只添加子数据 } else {//list中存在主数据,只添加子数据
Method getMethod = ReflectUtil.getMethod(this.mainClass, "get" + this.subObjectMethodName); Method getMethod = ReflectUtil.getMethod(this.mainClass, "get" + this.subObjectMethodName);
@ -132,10 +130,10 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
} }
private String getOnlyOneAnnotation() { private String getOnlyOneAnnotation() {
Field[] fields = mainClass.getDeclaredFields(); Field[] fields = this.getAllFields(this.mainClass);
for (Field field : fields) { for (Field field : fields) {
// 只判断该字段拥有非空注解 // 只判断该字段拥有非空注解
if (AnnotationUtil.hasAnnotation(field, OnlyOne.class)){ if (field.isAnnotationPresent(OnlyOne.class)) {
//获取属性的名字 //获取属性的名字
String attributeName = field.getName(); String attributeName = field.getName();
//将属性名字的首字母大写 //将属性名字的首字母大写
@ -146,16 +144,10 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
} }
private String getSubObjectAnnotation() { private String getSubObjectAnnotation() {
Object object; Field[] fields = this.getAllFields(this.mainClass);
try {
object = mainClass.getDeclaredConstructors()[0].newInstance((Object) null);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) { for (Field field : fields) {
// 只判断该字段拥有非空注解 // 只判断该字段拥有非空注解
if (AnnotationUtil.hasAnnotation(field, SubObject.class)) { if (field.isAnnotationPresent(SubObject.class)) {
Class<?> fieldType = field.getType(); Class<?> fieldType = field.getType();
if (Collection.class.isAssignableFrom(fieldType)) { if (Collection.class.isAssignableFrom(fieldType)) {
java.lang.reflect.Type[] actualType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments(); java.lang.reflect.Type[] actualType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments();
@ -163,7 +155,7 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
// 非class类型的不处理 // 非class类型的不处理
throw new ServiceException().setMessage("SubObject非泛型"); throw new ServiceException().setMessage("SubObject非泛型");
} }
this.subClass = actualType[0].getClass(); this.subClassName = actualType[0].getTypeName();
} else { } else {
throw new ServiceException().setMessage("SubObject注解属性必须是Collection实现类"); throw new ServiceException().setMessage("SubObject注解属性必须是Collection实现类");
} }
@ -175,5 +167,25 @@ public class ExcelListener<T> extends AnalysisEventListener<T> {
} }
return null; return null;
} }
/**
* <p>获取自己及继承自父类的所有字段包括私有字段和受保护字段可以使用反射 API 中的 getDeclaredFields() 方法来递归获取父类的字段</p>
*
* @param clazz clazz
* @return {@link Field[] }
* @see Class<?>
* @see Field[]
*/
private Field[] getAllFields(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
Class<?> parent = clazz.getSuperclass();
if (parent != null) {
Field[] parentFields = getAllFields(parent);
Field[] allFields = new Field[fields.length + parentFields.length];
System.arraycopy(fields, 0, allFields, 0, fields.length);
System.arraycopy(parentFields, 0, allFields, fields.length, parentFields.length);
fields = allFields;
}
return fields;
}
} }

8
win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java

@ -1,8 +0,0 @@
/**
* system 模块下我们放通用业务支撑上层的核心业务
* 例如说用户部门权限数据字典等等
*
* 1. Controller URL /system/ 开头避免和其它 Module 冲突
* 2. DataObject 表名 system_ 开头方便在数据库中区分
*/
package com.win.module.system;

2
win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/DictTypeConstants.java

@ -64,5 +64,7 @@ public interface DictTypeConstants {
String LABEL_TYPE = "label_type";//标签类型 String LABEL_TYPE = "label_type";//标签类型
String CARRIER_TYPE = "carrier_type";//承运商类型 String CARRIER_TYPE = "carrier_type";//承运商类型
String INVENTORY_STATUS = "inventory_status";//库存状态 String INVENTORY_STATUS = "inventory_status";//库存状态
String REQUEST_STATUS = "request_status";//请求状态
String PURCHASE_RETURN_REASON = "purchase_return_reason";//原因
} }

27
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/PurchaseclaimRequestMainController.java

@ -4,6 +4,7 @@ import com.win.framework.common.pojo.CommonResult;
import com.win.framework.common.pojo.CustomConditions; import com.win.framework.common.pojo.CustomConditions;
import com.win.framework.common.pojo.PageResult; import com.win.framework.common.pojo.PageResult;
import com.win.framework.dict.core.util.DictFrameworkUtils; import com.win.framework.dict.core.util.DictFrameworkUtils;
import com.win.framework.excel.core.util.ConvertUtil;
import com.win.framework.excel.core.util.ExcelUtils; import com.win.framework.excel.core.util.ExcelUtils;
import com.win.framework.operatelog.core.annotations.OperateLog; import com.win.framework.operatelog.core.annotations.OperateLog;
import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.AdminUserApi;
@ -116,6 +117,11 @@ public class PurchaseclaimRequestMainController {
public void exportPurchaseclaimRequestMainExcel(@Valid PurchaseclaimRequestMainExportReqVO exportReqVO, HttpServletResponse response) throws IOException { public void exportPurchaseclaimRequestMainExcel(@Valid PurchaseclaimRequestMainExportReqVO exportReqVO, HttpServletResponse response) throws IOException {
List<PurchaseclaimRequestMainDO> list = purchaseclaimRequestMainService.getPurchaseclaimRequestMainList(exportReqVO); List<PurchaseclaimRequestMainDO> list = purchaseclaimRequestMainService.getPurchaseclaimRequestMainList(exportReqVO);
//组装vo //组装vo
Map<Integer, String[]> mapDropDown = new HashMap<>();
String[] purchaseReturnReason = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.PURCHASE_RETURN_REASON);
mapDropDown.put(16, purchaseReturnReason);
String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM);
mapDropDown.put(25, uom);
List<PurchaseclaimRequestDetailExcelVO> resultList = new ArrayList<>(); List<PurchaseclaimRequestDetailExcelVO> resultList = new ArrayList<>();
for(PurchaseclaimRequestMainDO mainDO : list) { for(PurchaseclaimRequestMainDO mainDO : list) {
List<PurchaseclaimRequestDetailDO> subList = purchaseclaimRequestDetailService.getPurchaseclaimRequestDetailList(mainDO.getId()); List<PurchaseclaimRequestDetailDO> subList = purchaseclaimRequestDetailService.getPurchaseclaimRequestDetailList(mainDO.getId());
@ -125,21 +131,24 @@ public class PurchaseclaimRequestMainController {
} }
} }
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "采购索赔申请主.xlsx", "数据", PurchaseclaimRequestDetailExcelVO.class, resultList); ExcelUtils.write(response, "采购索赔申请主.xlsx", "数据", PurchaseclaimRequestDetailExcelVO.class, resultList, mapDropDown);
} }
@GetMapping("/get-import-template") @GetMapping("/get-import-template")
@Operation(summary = "获得导入采购索赔信息模板") @Operation(summary = "获得导入采购索赔信息模板")
public void importTemplate(HttpServletResponse response) throws IOException { public void importTemplate(HttpServletResponse response) throws IOException {
// 手动创建导出 demo // 手动创建导出 demo
List<PurchaseclaimRequestDetailImportVO> list = new ArrayList<>(); List<PurchaseclaimRequestImportVO> list = new ArrayList<>();
Map<Integer, String[]> mapDropDown = new HashMap<>(); Map<Integer, String[]> mapDropDown = new HashMap<>();
String[] status = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.ITEM_STATUS); String[] purchaseReturnReason = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.PURCHASE_RETURN_REASON);
mapDropDown.put(4, status); mapDropDown.put(16, purchaseReturnReason);
String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM);
mapDropDown.put(25, uom);
// 输出 // 输出
ExcelUtils.write(response, "采购索赔信息导入模板.xlsx", "采购索赔信息列表", PurchaseclaimRequestDetailImportVO.class, list,mapDropDown); ExcelUtils.write(response, "采购索赔信息导入模板.xlsx", "采购索赔信息列表", PurchaseclaimRequestImportVO.class, list, mapDropDown);
} }
@PostMapping("/import") @PostMapping("/import")
@Operation(summary = "导入采购索赔基本信息") @Operation(summary = "导入采购索赔基本信息")
@Parameters({ @Parameters({
@ -147,13 +156,15 @@ public class PurchaseclaimRequestMainController {
@Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"), @Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"),
@Parameter(name = "updatePart", description = "部分更新,默认为 true", example = "true") @Parameter(name = "updatePart", description = "部分更新,默认为 true", example = "true")
}) })
@PreAuthorize("@ss.hasPermission('wms:itembasic:import')") @PreAuthorize("@ss.hasPermission('wms:purchaseclaim-request-main:import')")
public CommonResult<Map<String, Object>> importExcel(HttpServletResponse response, public CommonResult<Map<String, Object>> importExcel(HttpServletResponse response,
@RequestParam("file") MultipartFile file, @RequestParam("file") MultipartFile file,
@RequestParam(value = "mode") Integer mode, @RequestParam(value = "mode") Integer mode,
@RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart) throws Exception { @RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart) throws Exception {
List<PurchaseclaimRequestMainCreateReqVO> list = ExcelUtils.read(file, PurchaseclaimRequestMainCreateReqVO.class); List<PurchaseclaimRequestImportVO> list = ExcelUtils.read(file, PurchaseclaimRequestImportVO.class);
List<PurchaseclaimRequestDetailImportVO> errorList = purchaseclaimRequestMainService.importPurchaseclaimRequestList(list, mode, updatePart); ConvertUtil<PurchaseclaimRequestMainCreateReqVO> convertUtil = new ConvertUtil<>(PurchaseclaimRequestMainCreateReqVO.class);
List<PurchaseclaimRequestMainCreateReqVO> createReqVOList = convertUtil.invoke(list).getDataList();
List<PurchaseclaimRequestImportErrorVO> errorList = purchaseclaimRequestMainService.importPurchaseclaimRequestList(createReqVOList, mode, updatePart);
Map<String, Object> returnMap = new HashMap<>(); Map<String, Object> returnMap = new HashMap<>();
returnMap.put("errorCount", errorList.size()); returnMap.put("errorCount", errorList.size());
if(!errorList.isEmpty()) { if(!errorList.isEmpty()) {

37
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestDetailExcelVO.java

@ -3,6 +3,7 @@ package com.win.module.wms.controller.purchaseclaimRequest.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.win.framework.excel.core.annotations.DictFormat; import com.win.framework.excel.core.annotations.DictFormat;
import com.win.framework.excel.core.convert.DictConvert; import com.win.framework.excel.core.convert.DictConvert;
import com.win.module.wms.enums.DictTypeConstants;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -40,15 +41,6 @@ public class PurchaseclaimRequestDetailExcelVO {
@ExcelProperty("业务类型") @ExcelProperty("业务类型")
private String businessType; private String businessType;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@ExcelProperty("创建者用户名")
private String creator;
@ExcelProperty("申请时间") @ExcelProperty("申请时间")
private LocalDateTime requestTime; private LocalDateTime requestTime;
@ -59,15 +51,9 @@ public class PurchaseclaimRequestDetailExcelVO {
private String departmentCode; private String departmentCode;
@ExcelProperty(value = "状态", converter = DictConvert.class) @ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("request_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 @DictFormat(DictTypeConstants.REQUEST_STATUS)
private String status; private String status;
@ExcelProperty("最后更新时间")
private LocalDateTime updateTime;
@ExcelProperty("最后更新者用户名")
private String updater;
@ExcelProperty("自动提交") @ExcelProperty("自动提交")
private String autoCommit; private String autoCommit;
@ -93,7 +79,7 @@ public class PurchaseclaimRequestDetailExcelVO {
private String poLine; private String poLine;
@ExcelProperty(value = "原因", converter = DictConvert.class) @ExcelProperty(value = "原因", converter = DictConvert.class)
@DictFormat("purchase_return_reason") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 @DictFormat(DictTypeConstants.PURCHASE_RETURN_REASON)
private String reason; private String reason;
@ExcelProperty("单价") @ExcelProperty("单价")
@ -121,7 +107,22 @@ public class PurchaseclaimRequestDetailExcelVO {
private BigDecimal qty; private BigDecimal qty;
@ExcelProperty(value = "计量单位", converter = DictConvert.class) @ExcelProperty(value = "计量单位", converter = DictConvert.class)
@DictFormat("uom") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 @DictFormat(DictTypeConstants.UOM)
private String uom; private String uom;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@ExcelProperty("创建者用户名")
private String creator;
@ExcelProperty("最后更新时间")
private LocalDateTime updateTime;
@ExcelProperty("最后更新者用户名")
private String updater;
} }

22
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestDetailImportVO.java → win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestImportErrorVO.java

@ -1,9 +1,15 @@
package com.win.module.wms.controller.purchaseclaimRequest.vo; package com.win.module.wms.controller.purchaseclaimRequest.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.win.framework.excel.core.annotations.DictFormat; import com.win.framework.excel.core.annotations.DictFormat;
import com.win.framework.excel.core.convert.DictConvert; import com.win.framework.excel.core.convert.DictConvert;
import com.win.module.wms.enums.DictTypeConstants;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -15,7 +21,11 @@ import java.time.LocalDateTime;
* @author 超级管理员 * @author 超级管理员
*/ */
@Data @Data
public class PurchaseclaimRequestDetailImportVO { @Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false)
public class PurchaseclaimRequestImportErrorVO {
@ExcelProperty("导入状态") @ExcelProperty("导入状态")
private String importStatus; private String importStatus;
@ -39,18 +49,16 @@ public class PurchaseclaimRequestDetailImportVO {
private String businessType; private String businessType;
@ExcelProperty("申请时间") @ExcelProperty("申请时间")
@ColumnWidth(value = 16)
private LocalDateTime requestTime; private LocalDateTime requestTime;
@ExcelProperty("截止时间") @ExcelProperty("截止时间")
@ColumnWidth(value = 16)
private LocalDateTime dueTime; private LocalDateTime dueTime;
@ExcelProperty("部门") @ExcelProperty("部门")
private String departmentCode; private String departmentCode;
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("request_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String status;
@ExcelProperty("自动提交") @ExcelProperty("自动提交")
private String autoCommit; private String autoCommit;
@ -76,7 +84,7 @@ public class PurchaseclaimRequestDetailImportVO {
private String poLine; private String poLine;
@ExcelProperty(value = "原因", converter = DictConvert.class) @ExcelProperty(value = "原因", converter = DictConvert.class)
@DictFormat("purchase_return_reason") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 @DictFormat(DictTypeConstants.PURCHASE_RETURN_REASON)
private String reason; private String reason;
@ExcelProperty("单价") @ExcelProperty("单价")
@ -104,7 +112,7 @@ public class PurchaseclaimRequestDetailImportVO {
private BigDecimal qty; private BigDecimal qty;
@ExcelProperty(value = "计量单位", converter = DictConvert.class) @ExcelProperty(value = "计量单位", converter = DictConvert.class)
@DictFormat("uom") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 @DictFormat(DictTypeConstants.UOM)
private String uom; private String uom;
@ExcelProperty("备注") @ExcelProperty("备注")

113
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestImportVO.java

@ -0,0 +1,113 @@
package com.win.module.wms.controller.purchaseclaimRequest.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.win.framework.excel.core.annotations.DictFormat;
import com.win.framework.excel.core.convert.DictConvert;
import com.win.module.wms.enums.DictTypeConstants;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 采购索赔申请子 Excel VO
*
* @author 超级管理员
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
public class PurchaseclaimRequestImportVO {
@ExcelProperty("发货单号")
private String asnNumber;
@ExcelProperty("要货计划单号")
private String ppNumber;
@ExcelProperty("供应商代码")
private String supplierCode;
@ExcelProperty("单据号")
private String number;
@ExcelProperty("业务类型")
private String businessType;
@ExcelProperty("申请时间")
@ColumnWidth(value = 16)
private LocalDateTime requestTime;
@ExcelProperty("截止时间")
@ColumnWidth(value = 16)
private LocalDateTime dueTime;
@ExcelProperty("部门")
private String departmentCode;
@ExcelProperty("自动提交")
private String autoCommit;
@ExcelProperty("自动通过")
private String autoAgree;
@ExcelProperty("自动执行")
private String autoExecute;
@ExcelProperty("直接生成记录")
private String directCreateRecord;
@ExcelProperty("批次")
private String batch;
@ExcelProperty("替代批次")
private String altBatch;
@ExcelProperty("订单号")
private String poNumber;
@ExcelProperty("订单行")
private String poLine;
@ExcelProperty(value = "原因", converter = DictConvert.class)
@DictFormat(DictTypeConstants.PURCHASE_RETURN_REASON)
private String reason;
@ExcelProperty("单价")
private BigDecimal singlePrice;
@ExcelProperty("金额")
private BigDecimal amount;
@ExcelProperty("物品代码")
private String itemCode;
@ExcelProperty("物品名称")
private String itemName;
@ExcelProperty("物品描述1")
private String itemDesc1;
@ExcelProperty("物品描述2")
private String itemDesc2;
@ExcelProperty("项目代码")
private String projectCode;
@ExcelProperty("数量")
private BigDecimal qty;
@ExcelProperty(value = "计量单位", converter = DictConvert.class)
@DictFormat(DictTypeConstants.UOM)
private String uom;
@ExcelProperty("备注")
private String remark;
}

2
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestMainBaseVO.java

@ -1,5 +1,6 @@
package com.win.module.wms.controller.purchaseclaimRequest.vo; package com.win.module.wms.controller.purchaseclaimRequest.vo;
import com.win.framework.excel.core.annotations.OnlyOne;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -29,6 +30,7 @@ public class PurchaseclaimRequestMainBaseVO {
@NotNull(message = "供应商代码不能为空") @NotNull(message = "供应商代码不能为空")
private String supplierCode; private String supplierCode;
@OnlyOne
@Schema(description = "单据号") @Schema(description = "单据号")
private String number; private String number;

2
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/purchaseclaimRequest/vo/PurchaseclaimRequestMainCreateReqVO.java

@ -1,5 +1,6 @@
package com.win.module.wms.controller.purchaseclaimRequest.vo; package com.win.module.wms.controller.purchaseclaimRequest.vo;
import com.win.framework.excel.core.annotations.SubObject;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -13,6 +14,7 @@ import java.util.List;
@ToString(callSuper = true) @ToString(callSuper = true)
public class PurchaseclaimRequestMainCreateReqVO extends PurchaseclaimRequestMainBaseVO { public class PurchaseclaimRequestMainCreateReqVO extends PurchaseclaimRequestMainBaseVO {
@SubObject
@Schema(description = "子表数据") @Schema(description = "子表数据")
private List<PurchaseclaimRequestDetailCreateReqVO> subList; private List<PurchaseclaimRequestDetailCreateReqVO> subList;

2
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/purchaseclaimRequest/PurchaseclaimRequestDetailConvert.java

@ -52,5 +52,5 @@ public interface PurchaseclaimRequestDetailConvert {
@Mapping(source = "mainVo.number", target = "number"), @Mapping(source = "mainVo.number", target = "number"),
@Mapping(source = "mainVo.remark", target = "remark"), @Mapping(source = "mainVo.remark", target = "remark"),
}) })
PurchaseclaimRequestDetailImportVO convert(PurchaseclaimRequestMainCreateReqVO mainVo, PurchaseclaimRequestDetailCreateReqVO detailVo); PurchaseclaimRequestImportErrorVO convert(PurchaseclaimRequestMainCreateReqVO mainVo, PurchaseclaimRequestDetailCreateReqVO detailVo);
} }

2
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/purchaseclaimRequest/PurchaseclaimRequestMainService.java

@ -86,5 +86,5 @@ public interface PurchaseclaimRequestMainService {
* @param updatePart 是否支持更新 * @param updatePart 是否支持更新
* @return 导入结果 * @return 导入结果
*/ */
public List<PurchaseclaimRequestDetailImportVO> importPurchaseclaimRequestList(List<PurchaseclaimRequestMainCreateReqVO> datas, Integer mode, boolean updatePart); public List<PurchaseclaimRequestImportErrorVO> importPurchaseclaimRequestList(List<PurchaseclaimRequestMainCreateReqVO> datas, Integer mode, boolean updatePart);
} }

42
win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/purchaseclaimRequest/PurchaseclaimRequestMainServiceImpl.java

@ -1,9 +1,9 @@
package com.win.module.wms.service.purchaseclaimRequest; package com.win.module.wms.service.purchaseclaimRequest;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.win.framework.common.exception.ServiceException;
import com.win.framework.common.pojo.CustomConditions; import com.win.framework.common.pojo.CustomConditions;
import com.win.framework.common.pojo.PageResult; import com.win.framework.common.pojo.PageResult;
import com.win.framework.dict.core.util.DictFrameworkUtils;
import com.win.module.system.api.serialnumber.SerialNumberApi; import com.win.module.system.api.serialnumber.SerialNumberApi;
import com.win.module.system.enums.serialNumber.RuleCodeEnum; import com.win.module.system.enums.serialNumber.RuleCodeEnum;
import com.win.module.wms.controller.purchaseclaimRequest.vo.*; import com.win.module.wms.controller.purchaseclaimRequest.vo.*;
@ -13,6 +13,7 @@ import com.win.module.wms.dal.dataobject.purchaseclaimRequest.PurchaseclaimReque
import com.win.module.wms.dal.dataobject.purchaseclaimRequest.PurchaseclaimRequestMainDO; import com.win.module.wms.dal.dataobject.purchaseclaimRequest.PurchaseclaimRequestMainDO;
import com.win.module.wms.dal.mysql.purchaseclaimRequest.PurchaseclaimRequestDetailMapper; import com.win.module.wms.dal.mysql.purchaseclaimRequest.PurchaseclaimRequestDetailMapper;
import com.win.module.wms.dal.mysql.purchaseclaimRequest.PurchaseclaimRequestMainMapper; import com.win.module.wms.dal.mysql.purchaseclaimRequest.PurchaseclaimRequestMainMapper;
import com.win.module.wms.enums.DictTypeConstants;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -116,31 +117,32 @@ public class PurchaseclaimRequestMainServiceImpl implements PurchaseclaimRequest
return purchaseclaimRequestMainMapper.selectList(exportReqVO); return purchaseclaimRequestMainMapper.selectList(exportReqVO);
} }
public List<PurchaseclaimRequestDetailImportVO> importPurchaseclaimRequestList(List<PurchaseclaimRequestMainCreateReqVO> datas, Integer mode, boolean updatePart) { public List<PurchaseclaimRequestImportErrorVO> importPurchaseclaimRequestList(List<PurchaseclaimRequestMainCreateReqVO> datas, Integer mode, boolean updatePart) {
if (CollUtil.isEmpty(datas)) { if (CollUtil.isEmpty(datas)) {
throw exception(PURCHASECLAIM_REQUEST_IMPORT_LIST_IS_EMPTY); throw exception(PURCHASECLAIM_REQUEST_IMPORT_LIST_IS_EMPTY);
} }
List<PurchaseclaimRequestDetailImportVO> errorList = new ArrayList<>(); List<PurchaseclaimRequestImportErrorVO> errorList = new ArrayList<>();
datas.forEach(createReqVO -> { datas.forEach(createReqVO -> {
// 校验,判断是否有不符合的原因,并加入errorList,如果主表则所有子表都加入errorList // 校验,判断是否有不符合的原因,并加入errorList,如果主表则所有子表都加入errorList
boolean isError = false; boolean isError = false;
String importRemark = ""; // String importRemark = "";
try { // try {
if(mode != null){ // if(mode != null){
validatePurchaseclaimRequestMainExists(null); // validatePurchaseclaimRequestMainExists(null);
} // }
} catch (ServiceException ex) { // } catch (ServiceException ex) {
isError = true; // isError = true;
importRemark += ex.getMessage() + ","; // importRemark += ex.getMessage() + ",";
} // }
if(isError) { // if(isError) {
List<PurchaseclaimRequestDetailCreateReqVO> subList = createReqVO.getSubList(); // List<PurchaseclaimRequestDetailCreateReqVO> subList = createReqVO.getSubList();
for (PurchaseclaimRequestDetailCreateReqVO detailVo : subList) { // for (PurchaseclaimRequestDetailCreateReqVO detailVo : subList) {
PurchaseclaimRequestDetailImportVO importVO = PurchaseclaimRequestDetailConvert.INSTANCE.convert(createReqVO, detailVo); // PurchaseclaimRequestImportErrorVO importVO = PurchaseclaimRequestDetailConvert.INSTANCE.convert(createReqVO, detailVo);
importVO.setImportStatus("失败"); // importVO.setImportStatus("失败");
importVO.setImportRemark(importRemark.substring(0, importRemark.length() - 1)); // importVO.setImportRemark(importRemark.substring(0, importRemark.length() - 1));
} // }
} // }
createReqVO.setStatus(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.REQUEST_STATUS, "新增"));
PurchaseclaimRequestMainDO createObj = PurchaseclaimRequestMainConvert.INSTANCE.convert(createReqVO); PurchaseclaimRequestMainDO createObj = PurchaseclaimRequestMainConvert.INSTANCE.convert(createReqVO);
purchaseclaimRequestMainMapper.insert(createObj); purchaseclaimRequestMainMapper.insert(createObj);
List<PurchaseclaimRequestDetailCreateReqVO> subList = createReqVO.getSubList(); List<PurchaseclaimRequestDetailCreateReqVO> subList = createReqVO.getSubList();

Loading…
Cancel
Save